inspect.signature() raises RuntimeError on failed to resolve the default argument value. For example, it fails to inspect a subclass of io.BufferedReader:
Example:
```
import inspect
import io
class MyBufferedReader(io.BufferedReader):
"""buffer reader class."""
inspect.signature(MyBufferedReader)
```
Result:
```
Traceback (most recent call last):
File "/Users/tkomiya/.pyenv/versions/3.9.1/lib/python3.9/inspect.py", line 2042, in wrap_value
value = eval(s, module_dict)
File "<string>", line 1, in <module>
NameError: name 'DEFAULT_BUFFER_SIZE' is not defined
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/tkomiya/.pyenv/versions/3.9.1/lib/python3.9/inspect.py", line 2045, in wrap_value
value = eval(s, sys_module_dict)
File "<string>", line 1, in <module>
NameError: name 'DEFAULT_BUFFER_SIZE' is not defined
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/tkomiya/work/tmp/doc/example.py", line 9, in <module>
inspect.signature(MyBufferedReader)
File "/Users/tkomiya/.pyenv/versions/3.9.1/lib/python3.9/inspect.py", line 3130, in signature
return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
File "/Users/tkomiya/.pyenv/versions/3.9.1/lib/python3.9/inspect.py", line 2879, in from_callable
return _signature_from_callable(obj, sigcls=cls,
File "/Users/tkomiya/.pyenv/versions/3.9.1/lib/python3.9/inspect.py", line 2397, in _signature_from_callable
return _signature_fromstr(sigcls, obj, text_sig)
File "/Users/tkomiya/.pyenv/versions/3.9.1/lib/python3.9/inspect.py", line 2095, in _signature_fromstr
p(name, default)
File "/Users/tkomiya/.pyenv/versions/3.9.1/lib/python3.9/inspect.py", line 2077, in p
default_node = RewriteSymbolics().visit(default_node)
File "/Users/tkomiya/.pyenv/versions/3.9.1/lib/python3.9/ast.py", line 407, in visit
return visitor(node)
File "/Users/tkomiya/.pyenv/versions/3.9.1/lib/python3.9/inspect.py", line 2069, in visit_Name
return wrap_value(node.id)
File "/Users/tkomiya/.pyenv/versions/3.9.1/lib/python3.9/inspect.py", line 2047, in wrap_value
raise RuntimeError()
RuntimeError
```
In my investigation, inspect.signature() tries to evaluate the default argument value of the class constructor. But it fails to evaluate because of the 2nd argument of the constructor takes a constant; `DEFAULT_BUFFER_SIZE`, but it is not found on the current context.
I think it would be better to search the constants for the modules of the base classes. I just made a simple patch to resolve this bug.
|