Pydoc uses inspect.signature() to get a function signature. inspect.signature() supports Python functions, and also extension functions defined with Argument Clinic (by parsing the __text_signature__ attribute). Unfortunately Argument Clinic is used with functions whose signature cannot be expressed in Python, e.g. getattr() or dict.pop(). It produces a human readable __text_signature__, but it can not be represented as a Signature object, so inspect.signature() fails. Pydoc display generic (...) for such functions.
Since pydoc only needs a string representation of signature, not a Signature object, I propose to use __text_signature__ if inspect.signature() fails. It needs only some trivial processing.
Before:
getattr(...)
Get a named attribute from an object.
getattr(x, 'y') is equivalent to x.y
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
After:
getattr(object, name, default=<unrepresentable>, /)
Get a named attribute from an object.
getattr(x, 'y') is equivalent to x.y
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
Linked PRs
Pydoc uses
inspect.signature()to get a function signature.inspect.signature()supports Python functions, and also extension functions defined with Argument Clinic (by parsing the__text_signature__attribute). Unfortunately Argument Clinic is used with functions whose signature cannot be expressed in Python, e.g.getattr()ordict.pop(). It produces a human readable__text_signature__, but it can not be represented as aSignatureobject, soinspect.signature()fails. Pydoc display generic(...)for such functions.Since pydoc only needs a string representation of signature, not a
Signatureobject, I propose to use__text_signature__ifinspect.signature()fails. It needs only some trivial processing.Before:
After:
Linked PRs