From a7d83934c1df2da7ae78d06b0a2e15d0806fc0f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felf=C3=B6ldy=20Tibor?= Date: Sun, 26 Jan 2025 21:45:00 +0100 Subject: [PATCH] Add dir __base__ recursively; Add dir tests to 70_builtins.py --- python/builtins.py | 16 ++++++++-------- tests/70_builtins.py | 19 ++++++++++++++++++- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/python/builtins.py b/python/builtins.py index 94271015..28f3bcca 100644 --- a/python/builtins.py +++ b/python/builtins.py @@ -85,18 +85,18 @@ def dir(obj=None): if obj is None: return list(globals().keys()) - if hasattr(obj, "__dir__"): - return obj.__dir__() - attributes = set() - # Set object attributes. + + if not isinstance(obj, type): + if hasattr(obj, "__dir__"): + return sorted(obj.__dir__()) + attributes.update(dir(type(obj))) + if hasattr(obj, "__dict__"): attributes.update(obj.__dict__.keys()) - # Set type attributes. - if not isinstance(obj, type): - if hasattr(type(obj), "__dict__"): - attributes.update(type(obj).__dict__.keys()) + if hasattr(obj, "__base__") and obj.__base__ is not None: + attributes.update(dir(obj.__base__)) return sorted(attributes) diff --git a/tests/70_builtins.py b/tests/70_builtins.py index 15d3a7ba..ad2fcb6c 100644 --- a/tests/70_builtins.py +++ b/tests/70_builtins.py @@ -49,4 +49,21 @@ assert not all([True, False]) assert not all([False, False]) assert list(enumerate([1,2,3])) == [(0,1), (1,2), (2,3)] -assert list(enumerate([1,2,3], 1)) == [(1,1), (2,2), (3,3)] \ No newline at end of file +assert list(enumerate([1,2,3], 1)) == [(1,1), (2,2), (3,3)] + +class C1: + def c(): ... + +class C2(C1): + a = 'a' + def __init__(self): + self.b = 1 + +class C3: + def __dir__(self): + return ["custom"] + +assert "__name__" in dir() +assert "a", "b" in dir(C2()) +assert "c" in dir(C2()) +assert ["custom"] == dir(C3())