[Python-Dev] inspect and metaclasses

Ethan Furman ethan at stoneleaf.us
Fri Sep 6 17:14:09 CEST 2013


On 09/06/2013 07:47 AM, Armin Rigo wrote:
>
> Are you suggesting that inspect.getmro(A) would return (A, object,
> type)?  That seems very wrong to me.

Currently, `inspect.getmro(A)` returns `(A, object)`.

Considering that Python actually will look in A's metaclass to find a class attribute, I think returning `(A, object, 
type(A)` is appropriate:

=================================================================================
Python 3.4.0a1+ (default:61ca4732399b+, Sep  4 2013, 22:28:04)
[GCC 4.7.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
--> class Meta(type):
...   meta_attr = 42
...

--> class Class(metaclass=Meta):
...   cls_attr = 'Vitamin-soaked towel'
...   def __init__(self):
...     self.inst_attr = 'dolphins'
...

--> test = Class()

--> test.inst_attr
'dolphins'

--> test.cls_attr
'Vitamin-soaked towel'

--> test.meta_attr
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: 'Class' object has no attribute 'meta_attr'

--> Class.cls_attr
'Vitamin-soaked towel'

--> Class.meta_attr
42

--> import inspect

--> inspect.getmro(Class)  #  with patch in place
(<class '__main__.Class'>, <class 'object'>, <class '__main__.Meta'>)
=================================================================================

> If the goal is to fix `inspect.classify_class_attrs()`, then this
> function only needs a specific fix, along the lines of looking in
> `getmro(A) + getmro(type(A))`.  (A more minor issue is that the bug
> report suggests `... + (type(A),)` only, but that's wrong: Python will
> also look in all the base classes of type(A).)

Good point.  Will incorporate that into the final fix, whichever way it ends up.


> "Fixing" inspect.getmro() as suggested would break a lot of other usages of it.

Any examples?

--
~Ethan~


More information about the Python-Dev mailing list