Close #19030: improvements to inspect and Enum.

inspect.getmembers and inspect.classify_class_attrs now search the metaclass
mro for types.DynamicClassAttributes (what use to be called
enum._RouteClassAttributeToGetattr); in part this means that these two
functions no longer rely solely on dir().

Besides now returning more accurate information, these improvements also
allow a more helpful help() on Enum classes.
This commit is contained in:
Ethan Furman 2013-09-25 07:14:41 -07:00
parent 7cba5fd267
commit e03ea37a7b
4 changed files with 155 additions and 60 deletions

View file

@ -652,6 +652,14 @@ class TestClassesAndFunctions(unittest.TestCase):
if isinstance(builtin, type):
inspect.classify_class_attrs(builtin)
def test_classify_VirtualAttribute(self):
class VA:
@types.DynamicClassAttribute
def ham(self):
return 'eggs'
should_find = inspect.Attribute('ham', 'data', VA, VA.__dict__['ham'])
self.assertIn(should_find, inspect.classify_class_attrs(VA))
def test_getmembers_descriptors(self):
class A(object):
dd = _BrokenDataDescriptor()
@ -695,6 +703,13 @@ class TestClassesAndFunctions(unittest.TestCase):
self.assertIn(('f', b.f), inspect.getmembers(b))
self.assertIn(('f', b.f), inspect.getmembers(b, inspect.ismethod))
def test_getmembers_VirtualAttribute(self):
class A:
@types.DynamicClassAttribute
def eggs(self):
return 'spam'
self.assertIn(('eggs', A.__dict__['eggs']), inspect.getmembers(A))
_global_ref = object()
class TestGetClosureVars(unittest.TestCase):
@ -1082,6 +1097,15 @@ class TestGetattrStatic(unittest.TestCase):
self.assertEqual(inspect.getattr_static(Thing, 'x'), Thing.x)
def test_classVirtualAttribute(self):
class Thing(object):
@types.DynamicClassAttribute
def x(self):
return self._x
_x = object()
self.assertEqual(inspect.getattr_static(Thing, 'x'), Thing.__dict__['x'])
def test_inherited_classattribute(self):
class Thing(object):
x = object()