我的问题的“X”是我正在尝试编写一个函数来确定一个callable是否接受变量关键字args,我在python2中这样做的方式是使用getargspec
调用,如下所示:
if six.PY2:
# First check if object is callable to make behaviour same as python3
if not callable(func):
raise TypeError('{!r} is not a callable object'.format(func))
try:
argspec = inspect.getargspec(func)
except TypeError:
try:
argspec = inspect.getargspec(func.__call__)
except (TypeError, AttributeError):
# assume function is valid, but weird, fall back to True
argspec = None
return not argspec or argspec[2] is not None
现在的问题是在python3下,建议的方法是使用Signature
个对象。但是,当我尝试以下内容时:
import inspect
class CallableKwargs(object):
def __call__(self, **kwargs):
pass
inspect.signature(CallableKwargs)
我仅使用 Python3.3 获得以下错误:
Traceback (most recent call last):
File "itest.py", line 9, in <module>
inspect.signature(CallableKwargs)
File "/usr/lib/python3.3/inspect.py", line 1449, in signature
raise ValueError('callable {!r} is not supported by signature'.format(obj))
ValueError: callable <class '__main__.CallableKwargs'> is not supported by signature
但是,我写的代码需要同时支持Python3.3和Python3.5,有没有解决方法呢?我尝试使用inspect.getfullargspec
,与Python中的inspect.getargspec
不同,该函数在传递{{1}时不会引发TypeError
(在3.4和3.5中,在3.3中引发TypeError
)但是,返回的dict不检查CallableKwargs
方法并且错误地返回:
__call__
在Python 3.4和Python 3.5中,这又是一个问题(请注意FullArgSpec(args=[], varargs=None, varkw=None, defaults=None, kwonlyargs=[],
kwonlydefaults=None, annotations={})
)。
那么,这里有什么我可以使用并且在3.3和3.5中都是一致的吗?