mirror of https://github.com/python/cpython
[3.13] gh-116789: Add more tests for `inspect.getmembers` (GH-116802) (#123129)
gh-116789: Add more tests for `inspect.getmembers` (GH-116802)
(cherry picked from commit c15bfa9a71
)
Co-authored-by: sobolevn <mail@sobolevn.me>
This commit is contained in:
parent
865bfb1530
commit
3822d7cd28
|
@ -1553,6 +1553,56 @@ 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_custom_dir(self):
|
||||
class CorrectDir:
|
||||
def __init__(self, attr):
|
||||
self.attr = attr
|
||||
def method(self):
|
||||
return self.attr + 1
|
||||
def __dir__(self):
|
||||
return ['attr', 'method']
|
||||
|
||||
cd = CorrectDir(5)
|
||||
self.assertEqual(inspect.getmembers(cd), [
|
||||
('attr', 5),
|
||||
('method', cd.method),
|
||||
])
|
||||
self.assertEqual(inspect.getmembers(cd, inspect.ismethod), [
|
||||
('method', cd.method),
|
||||
])
|
||||
|
||||
def test_getmembers_custom_broken_dir(self):
|
||||
# inspect.getmembers calls `dir()` on the passed object inside.
|
||||
# if `__dir__` mentions some non-existent attribute,
|
||||
# we still need to return others correctly.
|
||||
class BrokenDir:
|
||||
existing = 1
|
||||
def method(self):
|
||||
return self.existing + 1
|
||||
def __dir__(self):
|
||||
return ['method', 'missing', 'existing']
|
||||
|
||||
bd = BrokenDir()
|
||||
self.assertEqual(inspect.getmembers(bd), [
|
||||
('existing', 1),
|
||||
('method', bd.method),
|
||||
])
|
||||
self.assertEqual(inspect.getmembers(bd, inspect.ismethod), [
|
||||
('method', bd.method),
|
||||
])
|
||||
|
||||
def test_getmembers_custom_duplicated_dir(self):
|
||||
# Duplicates in `__dir__` must not fail and return just one result.
|
||||
class DuplicatedDir:
|
||||
attr = 1
|
||||
def __dir__(self):
|
||||
return ['attr', 'attr']
|
||||
|
||||
dd = DuplicatedDir()
|
||||
self.assertEqual(inspect.getmembers(dd), [
|
||||
('attr', 1),
|
||||
])
|
||||
|
||||
def test_getmembers_VirtualAttribute(self):
|
||||
class M(type):
|
||||
def __getattr__(cls, name):
|
||||
|
|
Loading…
Reference in New Issue