I have a typical implementation __dir__
in the base class that should return a list of all user-defined attributes __slots__
. This works, in general, but it seems to do the result sort
by the result before it returns, although I did not program it (I need the attributes so that the same order is assigned).
Example:
class A:
__slots__ = ['b', 'a']
def __dir__(self):
slot_attrs = []
for parent_class in reversed(type(self).__mro__[:-1]):
for attr in parent_class.__slots__:
slot_attrs.append(attr)
for attr in self.__slots__:
slot_attrs.append(attr)
return slot_attrs
class B(A):
__slots__ = ['c', 'd']
pass
class C(B):
__slots__ = []
pass
class D:
__slots__ = ['b', 'a']
def slots(self):
slot_attrs = []
for parent_class in reversed(type(self).__mro__[:-1]):
for attr in parent_class.__slots__:
slot_attrs.append(attr)
for attr in self.__slots__:
slot_attrs.append(attr)
return slot_attrs
class E(D):
__slots__ = ['c', 'd']
pass
class F(E):
pass
The conclusion for slots()
and __dir__()
should be, imo, identical.
but instead this happens:
>>>c = C()
>>>f = F()
>>>print(dir(c))
['a', 'b', 'c', 'd']
>>>print(f.slots())
['b', 'a', 'c', 'd', 'c', 'd', 'c', 'd']
, dir()
- . , - , , - , __dir__
.
. , dir
- , , set
, , , slots()
.
) , , ), dir
.
?
:
- __mro__
, , , .
:.
>>>F.__mro__
(<class '__main__.F'>, <class '__main__.E'>, <class '__main__.D'>, <class 'object'>)
2:
. , , :
>>Couldn't __dir__ also be allowed to return a tuple?
no, because tuples are not sortable, and i don't want to
over complicate the c-side code of PyObject_Dir.
having __dir__ returning only a list is equivalent to
__repr__ returning only strings.
, C, __dir__
.
3:
python bug tracker. , . , , backburner ( ), dir()
is, afaik, IDLE ..