Stefan Behnel added the comment:

Hmm, I now notice that I was mistaken about this working:

'''
import inspect

def test_isfunction():
    """
    >>> test_isfunction()
    True
    """
    return inspect.isfunction(test_isfunction)
'''

It only worked in Cython's test suite because its test runner monkey patches 
"inspect.isfunction", and I had completely forgotten about it. Sorry for the 
confusion.

The thing is that Cython's function type isn't really a Python function 
(obviously), it inherits from PyCFunction, so it should return True for 
isbuiltin(). A problem on our side prevented that. If I fix it up, then the 
newly added duck-typing code actually ends up not being used, because 
signature() tests for isbuiltin() first and runs into Signature.from_builtin(), 
which is the Argument Clinic code path that expects a textual signature 
representation. Cython functions don't have that, because they are compatible 
with Python functions.

This situation could be helped in inspect.signature() by reversing the test 
order, i.e. by changing this code

    if _signature_is_builtin(obj):
        return Signature.from_builtin(obj)

    if isfunction(obj) or _signature_is_functionlike(obj):
        # If it's a pure Python function, or an object that is duck type
        # of a Python function (Cython functions, for instance), then:
        return Signature.from_function(obj)

into this:

    if isfunction(obj) or _signature_is_functionlike(obj):
        # If it's a pure Python function, or an object that is duck type
        # of a Python function (Cython functions, for instance), then:
        return Signature.from_function(obj)

    if _signature_is_builtin(obj):
        return Signature.from_builtin(obj)

Would this be ok?

I would also argue that the implementation of _signature_is_builtin() is, well, 
not ideal, because what it should test for according to the comment at the top 
of the function is the existance of "__text_signature__". Instead, it does 
several type tests, one of which goes wrong in this case.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue17159>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to