mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
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:
parent
7cba5fd267
commit
e03ea37a7b
4 changed files with 155 additions and 60 deletions
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue