Определить ключевые слова сопрограммы торнадо

Я хочу проверить сопрограмму 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


person MRocklin    schedule 30.04.2018    source источник
comment
Из торнадо 4 gen.coroutine сохраняет исходную функцию в атрибут __wrapped__, и вы можете ее проверить: inspect.getargspec(f.b.__wrapped__) # ArgSpec(args=['self', 'x', 'y'], varargs=None, keywords=None, defaults=(None,))   -  person Gennady Kandaurov    schedule 03.05.2018


Ответы (1)


В стандартной библиотеке Python 2 нет ничего, что могло бы это сделать (но, как вы заметили, в Python 3 это работает нормально). Вам нужно будет получить доступ к атрибуту __wrapped__ самостоятельно. Как было предложено в ответе Мартина Питерса на аналогичный вопрос, вы можете использовать копию функции inspect.unwrap из Python 3 или упрощенную версию как

def unwrap(func):
    while hasattr(func, '__wrapped__'):
        func = func.__wrapped__
    return func
person Ben Darnell    schedule 04.05.2018