【问题标题】:Determine keywords of a tornado coroutine确定龙卷风协程的关键字
【发布时间】:2018-10-10 13:09:08
【问题描述】:

我想检查一个 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 中回答诸如“foo.b 是否有一个名为 y 的参数?”之类的问题

【问题讨论】:

  • 从 tornado 4 开始,gen.coroutine 将原始函数保存到 __wrapped__ 属性中,您可以检查它:inspect.getargspec(f.b.__wrapped__) # ArgSpec(args=['self', 'x', 'y'], varargs=None, keywords=None, defaults=(None,))

标签: python tornado inspect


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多