确定龙卷风协程的关键字

时间:2018-04-30 12:25:21

标签: python tornado inspect

我想检查Tornado协程,看它是否有某些关键字。通常我会使用inspect模块执行此操作,尤其是inspect.signature,这非常有用。但是在Python 2中(我必须同时支持)签名不存在,所以我正在寻找替代方案。标准inspect.getargspec无法正常工作。

In [1]: import inspect

In [2]: import tornado.gen

In [3]: class Foo(object):
   ...:     def a(self, x, y=None):
   ...:         pass
   ...:     
   ...:     @tornado.gen.coroutine
   ...:     def b(self, x, y=None):
   ...:         pass
   ...:     

In [4]: foo = Foo()

In [5]: inspect.getargspec(foo.a)
Out[5]: ArgSpec(args=['self', 'x', 'y'], varargs=None, keywords=None, defaults=(None,))

In [6]: inspect.getargspec(foo.b)
Out[6]: ArgSpec(args=[], varargs='args', keywords='kwargs', defaults=None)

In [7]: import sys; sys.version_info
Out[7]: sys.version_info(major=2, minor=7, micro=14, releaselevel='final', serial=0)

在Python 2中,有没有办法回答像#34这样的问题; foo.b有一个名为y的参数吗?"

1 个答案:

答案 0 :(得分:1)

Python 2标准库中没有任何东西可以做到这一点(但正如你在Python 3上所说,它工作正常)。您需要自己访问__wrapped__属性。正如Martijn Pieters' answer中针对类似问题所建议的那样,您可以使用Python 3中inspect.unwrap函数的副本或

这样的简化版本
def unwrap(func):
    while hasattr(func, '__wrapped__'):
        func = func.__wrapped__
    return func