确定龙卷风协程的关键字
Determine keywords of a tornado coroutine
我想检查一个 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 中回答像 "does foo.b
have a parameter named y
?"
这样的问题
Python 2 标准库中没有任何东西可以做到这一点(但正如您在 Python 3 中提到的那样,它工作正常)。您需要自己访问 __wrapped__
属性。正如 对类似问题的建议,您可以使用 Python 3 中的 inspect.unwrap
函数的副本或像
这样的简化版本
def unwrap(func):
while hasattr(func, '__wrapped__'):
func = func.__wrapped__
return func
我想检查一个 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 中回答像 "does foo.b
have a parameter named y
?"
Python 2 标准库中没有任何东西可以做到这一点(但正如您在 Python 3 中提到的那样,它工作正常)。您需要自己访问 __wrapped__
属性。正如 inspect.unwrap
函数的副本或像
def unwrap(func):
while hasattr(func, '__wrapped__'):
func = func.__wrapped__
return func