inspect.signature:在python3.3和python3.4 +中获得不同的行为

时间:2016-07-26 08:49:30

标签: python python-3.x python-3.3 python-3.5

我的问题的“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中都是一致的吗?

0 个答案:

没有答案