Created on 2015-04-09 14:34 by zzzeek, last changed 2022-04-11 14:58 by admin. This issue is now closed.
this bug appeared in Python 3.4. The inspect.classify_class_attrs compares the identity objects of unknown type using the `==` operator unnecessarily and also evaluates objects of unknown type assuming they return `True` for a straight boolean evaluation. This breaks among other things the ability to use the help() function with SQLAlchemy mapped objects.
Demo:
class MySpecialObject(object):
def __eq__(self, other):
return MySpecialObject()
def __bool__(self):
raise NotImplementedError(
"This object does not specify a boolean value")
class MyClass(object):
some_thing = MySpecialObject()
import inspect
print(inspect.classify_class_attrs(MyClass))
# ultimate goal: help(MyClass)
A patch here would be to compare unknown objects for identity using the `is` operator as well as using `is not None` when asserting that an object of unknown type is non-None. This patch resolves:
--- inspect_orig.py 2015-04-09 10:28:46.000000000 -0400
+++ inspect.py 2015-04-09 10:29:37.000000000 -0400
@@ -380,7 +380,7 @@
# first look in the classes
for srch_cls in class_bases:
srch_obj = getattr(srch_cls, name, None)
- if srch_obj == get_obj:
+ if srch_obj is get_obj:
last_cls = srch_cls
# then check the metaclasses
for srch_cls in metamro:
@@ -388,7 +388,7 @@
srch_obj = srch_cls.__getattr__(cls, name)
except AttributeError:
continue
- if srch_obj == get_obj:
+ if srch_obj is get_obj:
last_cls = srch_cls
if last_cls is not None:
homecls = last_cls
@@ -402,7 +402,7 @@
# unable to locate the attribute anywhere, most likely due to
# buggy custom __dir__; discard and move on
continue
- obj = get_obj or dict_obj
+ obj = get_obj if get_obj is not None else dict_obj
# Classify the object or its descriptor.
if isinstance(dict_obj, staticmethod):
kind = "static method"
This looks reasonable to me. It would be great if the patch could be attached to the issue as a patch file, including some tests.
> It would be great if the patch could be attached to the issue as a patch file, including some tests. the mantra we all share. I'll take a look.
patch w/ test
The patch looks good, Mike. Could you please sign PSF Contributor Agreement?
hi Yury - I did sign it earlier today. It should have been sent off to the person that manages that, at least that's what the email receipt said.
Mike, please ping me when they process it. I'll commit your patch.
hi Yury - I have a confirmation including a PDF attachment of the agreement, the message reads: " Python Contributor Agreement Form between Python Software Foundation and Michael Bayer is Signed and Filed! From: Ewa Jodlowska (Python Software Foundation) To: Ewa Jodlowska and Michael Bayer " can I forward that to you?
my star went through. let's merge.
New changeset fb9addfdfc35 by Yury Selivanov in branch '3.4': Issue 23898: Fix inspect.classify_class_attrs() to work with __eq__ https://hg.python.org/cpython/rev/fb9addfdfc35 New changeset d6a9d225413a by Yury Selivanov in branch 'default': Issue 23898: Fix inspect.classify_class_attrs() to work with __eq__ https://hg.python.org/cpython/rev/d6a9d225413a
Merged. Thanks for the bug report and patch, Mike!
thanks for the merge!
assignee: yselivanov
resolution: fixed
stage: commit review -> resolved
messages: + msg240335
stage: needs patch