summaryrefslogtreecommitdiffstats
path: root/Lib/inspect.py
diff options
context:
space:
mode:
authorWeipeng Hong <hongweichen8888@sina.com>2021-11-30 18:23:13 (GMT)
committerGitHub <noreply@github.com>2021-11-30 18:23:13 (GMT)
commitaf8c8caaf5e07c02202d736a31f6a2f7e27819b8 (patch)
treefaffacba8a6e1fe2d1b6dffeaba18242526e2020 /Lib/inspect.py
parent4b97d974ecca9cce532be55410fe851eb9fdcf21 (diff)
downloadcpython-af8c8caaf5e07c02202d736a31f6a2f7e27819b8.zip
cpython-af8c8caaf5e07c02202d736a31f6a2f7e27819b8.tar.gz
cpython-af8c8caaf5e07c02202d736a31f6a2f7e27819b8.tar.bz2
bpo-30533:Add function inspect.getmembers_static that does not call properties or dynamic properties. (#20911)
* Add function inspect.getmembers_static that does not call properties or dynamic properties. * update _getmembers args * Update Misc/NEWS.d/next/Library/2020-06-16-18-00-56.bpo-30533.StL57t.rst Co-authored-by: Itamar Ostricher <itamarost@gmail.com> * Update Lib/inspect.py Co-authored-by: Itamar Ostricher <itamarost@gmail.com> * Removes the copy pasted doc string Co-authored-by: Itamar Ostricher <itamarost@gmail.com> Co-authored-by: Dino Viehland <dinoviehland@gmail.com>
Diffstat (limited to 'Lib/inspect.py')
-rw-r--r--Lib/inspect.py25
1 files changed, 21 insertions, 4 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py
index dd89111..1eb2f2b 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -440,9 +440,7 @@ def isabstract(object):
return True
return False
-def getmembers(object, predicate=None):
- """Return all members of an object as (name, value) pairs sorted by name.
- Optionally, only return members that satisfy a given predicate."""
+def _getmembers(object, predicate, getter):
if isclass(object):
mro = (object,) + getmro(object)
else:
@@ -465,7 +463,7 @@ def getmembers(object, predicate=None):
# like calling their __get__ (see bug #1785), so fall back to
# looking in the __dict__.
try:
- value = getattr(object, key)
+ value = getter(object, key)
# handle the duplicate key
if key in processed:
raise AttributeError
@@ -484,6 +482,25 @@ def getmembers(object, predicate=None):
results.sort(key=lambda pair: pair[0])
return results
+def getmembers(object, predicate=None):
+ """Return all members of an object as (name, value) pairs sorted by name.
+ Optionally, only return members that satisfy a given predicate."""
+ return _getmembers(object, predicate, getattr)
+
+def getmembers_static(object, predicate=None):
+ """Return all members of an object as (name, value) pairs sorted by name
+ without triggering dynamic lookup via the descriptor protocol,
+ __getattr__ or __getattribute__. Optionally, only return members that
+ satisfy a given predicate.
+
+ Note: this function may not be able to retrieve all members
+ that getmembers can fetch (like dynamically created attributes)
+ and may find members that getmembers can't (like descriptors
+ that raise AttributeError). It can also return descriptor objects
+ instead of instance members in some cases.
+ """
+ return _getmembers(object, predicate, getattr_static)
+
Attribute = namedtuple('Attribute', 'name kind defining_class object')
def classify_class_attrs(cls):