import inspect
import sys
try:
import importlib.metadata as importlib_metadata # noqa F401
except ImportError: # pragma: no cover
# bw-compat shim for py37
import importlib_metadata # noqa F401
def fix_type_error(exc_info, callable, varargs, kwargs):
"""
Given an exception, this will test if the exception was due to a
signature error, and annotate the error with better information if
so.
Usage::
try:
val = callable(*args, **kw)
except TypeError:
exc_info = fix_type_error(None, callable, args, kw)
raise exc_info[0], exc_info[1], exc_info[2]
"""
if exc_info is None:
exc_info = sys.exc_info()
if (
exc_info[0] != TypeError
or str(exc_info[1]).find('arguments') == -1
or getattr(exc_info[1], '_type_error_fixed', False)
):
return exc_info
exc_info[1]._type_error_fixed = True
argspec = inspect.formatargspec(*inspect.getargspec(callable))
args = ', '.join(map(_short_repr, varargs))
if kwargs and args:
args += ', '
if kwargs:
kwargs = sorted(kwargs.items())
args += ', '.join(['%s=...' % n for n, v in kwargs])
gotspec = '(%s)' % args
msg = f'{exc_info[1]}; got {gotspec}, wanted {argspec}'
exc_info[1].args = (msg,)
return exc_info
ERRO:
AttributeError: module 'inspect' has no attribute 'formatargspec'.
Did you mean: 'formatargvalues'?
I've tried some changes to the code line, but to no avail.
argspec = inspect.formatargspec(*inspect.getargspec(callable))
Every help is welcome