[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:
Miss Islington (bot) 2024-08-26 11:51:56 +02:00 committed by GitHub
parent 865bfb1530
commit 3822d7cd28
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 50 additions and 0 deletions

View File

@ -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):