diff options
author | Weipeng Hong <hongweichen8888@sina.com> | 2021-11-30 18:23:13 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-30 18:23:13 (GMT) |
commit | af8c8caaf5e07c02202d736a31f6a2f7e27819b8 (patch) | |
tree | faffacba8a6e1fe2d1b6dffeaba18242526e2020 /Lib/inspect.py | |
parent | 4b97d974ecca9cce532be55410fe851eb9fdcf21 (diff) | |
download | cpython-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.py | 25 |
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): |