This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2010年10月01日 13:47 by Yaroslav.Halchenko, last changed 2022年04月11日 14:57 by admin. This issue is now closed.
| Messages (5) | |||
|---|---|---|---|
| msg117798 - (view) | Author: Yaroslav Halchenko (Yaroslav.Halchenko) | Date: 2010年10月01日 13:47 | |
We ran into this while generating documentation for our project (PyMVPA) with recent sphinx and python2.6 (fine with 2.5, failed for 2.6, 2.7, 3.1), which relies on traversing all attributes given by "dir(obj)", BUT apparently __abstractmethods__ becomes very special -- it is given by "dir(obj)" since it is present in obj.__class__, but getattr(obj, "__abstractmethods__") fails for classes derived from type. E.g. following sample demonstrates it:
print("in type's dir" , '__abstractmethods__' in dir(type))
print(type.__abstractmethods__)
class type3(type):
pass
print("in type3's dir" , '__abstractmethods__' in dir(type3))
print(type3.__abstractmethods__)
results in output:
$> python2.6 trash/type_subclass.py
("in type's dir", True)
<attribute '__abstractmethods__' of 'type' objects>
("in type3's dir", True)
Traceback (most recent call last):
File "trash/type_subclass.py", line 9, in <module>
print(type3.__abstractmethods__)
AttributeError: __abstractmethods__
$> python3.1 trash/type_subclass.py
in type's dir True
<attribute '__abstractmethods__' of 'type' objects>
in type3's dir True
Traceback (most recent call last):
File "trash/type_subclass.py", line 9, in <module>
print(type3.__abstractmethods__)
AttributeError: __abstractmethods__
And that seems to be the only attribute behaving like that (others are fine and accessible). Some people even seems to provide workarounds already, e.g.:
http://bitbucket.org/DasIch/bpython-colorful/src/19bb4cb0a65d/bpython/repl.py
when __abstractmethods__ is accessed only for the subclasses of ABCmeta ...
so, is it a bug or a feature (so we have to take care about it in all traversals of attributes given by dir())? ;)
|
|||
| msg117814 - (view) | Author: Benjamin Peterson (benjamin.peterson) * (Python committer) | Date: 2010年10月01日 16:23 | |
I see the problem; will consider/fix later today hopefully. |
|||
| msg117853 - (view) | Author: Benjamin Peterson (benjamin.peterson) * (Python committer) | Date: 2010年10月02日 00:05 | |
As of r85154, type.__abstractmethods__ now raises an AttributeError, too. |
|||
| msg117861 - (view) | Author: Yaroslav Halchenko (Yaroslav.Halchenko) | Date: 2010年10月02日 04:45 | |
yikes... surprising resolution -- I expected that fix would either makes __abstractmethods__ accessible in derived "type"s or becomes absent from output of dir() -- but none of those has happened. Now we ended up with a consistent non-Pythonic fate of __abstractmethods__ listed in output of dir() but not accessible. is that a feature? |
|||
| msg117885 - (view) | Author: Benjamin Peterson (benjamin.peterson) * (Python committer) | Date: 2010年10月02日 16:56 | |
2010年10月1日 Yaroslav Halchenko <report@bugs.python.org>: > > Yaroslav Halchenko <yarikoptic@gmail.com> added the comment: > > yikes... surprising resolution -- I expected that fix would either makes __abstractmethods__ accessible in derived "type"s or becomes absent from output of dir() -- but none of those has happened. Now we ended up with a consistent non-Pythonic fate of __abstractmethods__ listed in output of dir() but not accessible. is that a feature? type has no __abstractmethods__, so it should raise an AttributeError. Note descriptors are allowed to raise AttributeError even if they're in dir(). |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:57:07 | admin | set | github: 54215 |
| 2010年10月24日 17:34:12 | eric.araujo | set | versions: + Python 3.2, - Python 2.6 |
| 2010年10月02日 16:56:23 | benjamin.peterson | set | messages: + msg117885 |
| 2010年10月02日 04:45:22 | Yaroslav.Halchenko | set | messages: + msg117861 |
| 2010年10月02日 00:05:23 | benjamin.peterson | set | status: open -> closed resolution: fixed messages: + msg117853 |
| 2010年10月01日 17:00:38 | daniel.urban | set | nosy:
+ daniel.urban |
| 2010年10月01日 16:23:57 | benjamin.peterson | set | assignee: benjamin.peterson messages: + msg117814 |
| 2010年10月01日 14:54:02 | r.david.murray | set | nosy:
+ benjamin.peterson |
| 2010年10月01日 14:09:58 | Trundle | set | nosy:
+ Trundle |
| 2010年10月01日 13:47:31 | Yaroslav.Halchenko | create | |