[Python-checkins] cpython: Close #18929: inspect.classify_class_attrs will now search the metaclasses

ethan.furman python-checkins at python.org
Sun Sep 15 03:53:46 CEST 2013


http://hg.python.org/cpython/rev/b0517bb271ad
changeset:   85708:b0517bb271ad
user:        Ethan Furman <ethan at stoneleaf.us>
date:        Sat Sep 14 18:53:26 2013 -0700
summary:
  Close #18929: inspect.classify_class_attrs will now search the metaclasses (last) to find where an attr was defined.

files:
  Doc/library/inspect.rst |  5 +++--
  Lib/inspect.py          |  7 ++++++-
  2 files changed, 9 insertions(+), 3 deletions(-)


diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst
--- a/Doc/library/inspect.rst
+++ b/Doc/library/inspect.rst
@@ -173,8 +173,9 @@
 
    .. note::
 
-      :func:`getmembers` does not return metaclass attributes when the argument
-      is a class (this behavior is inherited from the :func:`dir` function).
+      :func:`getmembers` will only return metaclass attributes when the
+      argument is a class and those attributes have been listed in a custom
+      :meth:`__dir__`.
 
 
 .. function:: getmoduleinfo(path)
diff --git a/Lib/inspect.py b/Lib/inspect.py
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -308,9 +308,14 @@
            data attributes:  C.data is just a data object, but
            C.__dict__['data'] may be a data descriptor with additional
            info, like a __doc__ string.
+
+    If one of the items in dir(cls) is stored in the metaclass it will now
+    be discovered and not have None be listed as the class in which it was
+    defined.
     """
 
     mro = getmro(cls)
+    metamro = getmro(type(cls)) # for attributes stored in the metaclass
     names = dir(cls)
     result = []
     for name in names:
@@ -321,7 +326,7 @@
         # getattr(). This is the case with some descriptors (bug #1785).
         # Thus, we only use getattr() as a last resort.
         homecls = None
-        for base in (cls,) + mro:
+        for base in (cls,) + mro + metamro:
             if name in base.__dict__:
                 obj = base.__dict__[name]
                 homecls = base

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list