Skip to content

Commit

Permalink
pythongh-103193: Use LBYL idioms rather than EAFP in `inspect.getattr…
Browse files Browse the repository at this point in the history
…_static` (python#103318)
  • Loading branch information
AlexWaygood authored and warsaw committed Apr 11, 2023
1 parent e23bf26 commit a4e49a4
Showing 1 changed file with 10 additions and 15 deletions.
25 changes: 10 additions & 15 deletions Lib/inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -1787,11 +1787,8 @@ def _check_instance(obj, attr):

def _check_class(klass, attr):
for entry in _static_getmro(klass):
if _shadowed_dict(type(entry)) is _sentinel:
try:
return entry.__dict__[attr]
except KeyError:
pass
if _shadowed_dict(type(entry)) is _sentinel and attr in entry.__dict__:
return entry.__dict__[attr]
return _sentinel

def _is_type(obj):
Expand All @@ -1803,11 +1800,9 @@ def _is_type(obj):

def _shadowed_dict(klass):
for entry in _static_getmro(klass):
try:
class_dict = _get_dunder_dict_of_class(entry)["__dict__"]
except KeyError:
pass
else:
dunder_dict = _get_dunder_dict_of_class(entry)
if '__dict__' in dunder_dict:
class_dict = dunder_dict['__dict__']
if not (type(class_dict) is types.GetSetDescriptorType and
class_dict.__name__ == "__dict__" and
class_dict.__objclass__ is entry):
Expand Down Expand Up @@ -1850,11 +1845,11 @@ def getattr_static(obj, attr, default=_sentinel):
if obj is klass:
# for types we check the metaclass too
for entry in _static_getmro(type(klass)):
if _shadowed_dict(type(entry)) is _sentinel:
try:
return entry.__dict__[attr]
except KeyError:
pass
if (
_shadowed_dict(type(entry)) is _sentinel
and attr in entry.__dict__
):
return entry.__dict__[attr]
if default is not _sentinel:
return default
raise AttributeError(attr)
Expand Down

0 comments on commit a4e49a4

Please sign in to comment.