Skip to content

Commit

Permalink
gh-103193: Use LBYL idioms rather than EAFP in `inspect.getattr_stati…
Browse files Browse the repository at this point in the history
…c` (#103318)
  • Loading branch information
AlexWaygood authored Apr 6, 2023
1 parent 1724553 commit affedee
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 affedee

Please sign in to comment.