Upon trying to create a proxy I stumbled upon this exception: Traceback (most recent call last): File "foo.py", line 11, in p.__class__.__call__(p) SystemError: PyEval_EvalCodeEx: NULL globals Investigating further led me to this code which reproduces the exception: class Proxy(object): def __init__(self, proxied): self.proxied = proxied @property def __class__(self): return self.proxied.__class__ def __call__(self): return self.proxied.__call__() p = Proxy(lambda: 1) p.__class__.__call__(p) I understand that `p.__class__.__call__()` expects an argument of a different type however this is not obvious from the exception itself. PyPy on the other hand raises this exception: Traceback (most recent call last): File "app_main.py", line 53, in run_toplevel File "foo.py", line 11, in p.__class__.__call__(p) TypeError: 'function' object expected, got 'Proxy' instead Which explains the issue and is expected (at least by me) and apparently Jython raises an exception at least similar to PyPy's.
I think this is a duplicate of issue #9756: `methoddescr_call()` checks whether the given argument is acceptable as "self" argument and does so using `PyObject_IsInstance()`. As the class in the given code returns the type of the proxied object for the `__class__` attribute, that check will return true. As a quick fix, the attached patch (against release27-maint branch) will raise a TypeError as expected by the OP, but the real issue is much broader.
> I think this is a duplicate of issue #9756 Yes it is and the issue is now fixed. The example now fails with the correct exception: Traceback (most recent call last): File " x.py", line 12, in p.__class__.__call__(p) TypeError: descriptor '__call__' requires a 'function' object but received a 'Proxy'