[issue41780] Generic Alias attributes nor in dir()

2020-09-14 Thread Allan Daemon


New submission from Allan Daemon :

The implementation of PEP 585 in 3.9 adds some new attributes, but they aren't 
listed with dir() (then, not list in autocomplete and IntelliSense).

Python 3.9.0rc1+ (heads/3.9:d7cd1164c1, Aug 25 2020, 17:27:09)

>>> li = list[int]
>>> li.__origin__

>>> getattr(li, '__origin__')

>>> '__origin__' in dir(li)
False

That applies to:

__origin__
__args__
__parameters__

It seems to be not the expected behaviour, so this bug report. If this is not 
the case, some piece of documentation could be interesting. Also, I couldn't 
find anything about Generic Alias in the documentation, only in the source 
code. Should this be addressed too?

--
assignee: docs@python
components: Documentation, Library (Lib)
messages: 376873
nosy: AllanDaemon, docs@python
priority: normal
severity: normal
status: open
title: Generic Alias attributes nor in dir()
type: behavior
versions: Python 3.10, Python 3.9

___
Python tracker 
<https://bugs.python.org/issue41780>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue41780] Generic Alias attributes nor in dir()

2020-09-15 Thread Allan Daemon


Allan Daemon  added the comment:

> I actually have no idea where dir() gets its information.

I will share what I find out already, so it may hopefully be helpful.

The dir function used is the general object.__dir__ function, defined in 
Objects/typeobject.c:type___dir___impl(), that just takes everything from 
__dict__ of the class and its bases.

But the GenericAlias is trying hard pretending to be the origin class, so when 
you ask for the __dict__, it gives the original class, not the GenericAlias:

>>> list[int].__dict__ == list.__dict__
True

There are also some other things that seems a bit strange, but it may just be 
right:

>>> list.__class__

>>> list[int].__class__


>>> type(list)

>>> type(list[int])


This happens because of the tp_getattro function 
genericaliasobject.c:ga_getattro(), that takes the attributes from the origin 
except for the following names, that are taken from the GenericAlias itself:
"__origin__",
"__args__",
"__parameters__",
"__mro_entries__",
"__reduce_ex__",
"__reduce__",

So, when the dir() is getting the __dict__, it gets list.__dict__ and base 
(object) instead of GenericAlias. Looking the ga_getattro() calls when dir() is 
fired, it also gets the __class__ attribute after getting the __dict__. Adding 
one or another makes the dir() showing up the GenericAlias attributes, but 
others went missing.

An idea to solve this spefic issue could be overriding the __dir__ method, 
something like this python code (written in c, of course):

def __dir__(self):
r = super().__dir__()
return r + attribute_names_list + method_names_list


But I wonder what else should not be forwarded to origin.

--
components: +Interpreter Core -Documentation, Library (Lib)

___
Python tracker 
<https://bugs.python.org/issue41780>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com