summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsobolevn <mail@sobolevn.me>2024-08-18 15:42:56 (GMT)
committerGitHub <noreply@github.com>2024-08-18 15:42:56 (GMT)
commitc15bfa9a71c8b7ce7ff6d8486f51aab566e8d81d (patch)
treebeffef2b3359723c6bb06a0df42afabafe869a6e
parentb0f462d4c808d6fb1d381bba4932acd8309c1f3b (diff)
downloadcpython-c15bfa9a71c8b7ce7ff6d8486f51aab566e8d81d.zip
cpython-c15bfa9a71c8b7ce7ff6d8486f51aab566e8d81d.tar.gz
cpython-c15bfa9a71c8b7ce7ff6d8486f51aab566e8d81d.tar.bz2
gh-116789: Add more tests for `inspect.getmembers` (#116802)
-rw-r--r--Lib/test/test_inspect/test_inspect.py50
1 files changed, 50 insertions, 0 deletions
diff --git a/Lib/test/test_inspect/test_inspect.py b/Lib/test/test_inspect/test_inspect.py
index 730c192..aa65525 100644
--- a/Lib/test/test_inspect/test_inspect.py
+++ b/Lib/test/test_inspect/test_inspect.py
@@ -1550,6 +1550,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):