Определите ключевые слова сопрограммы торнадо - PullRequest
0 голосов
/ 30 апреля 2018

Я хочу проверить сопрограмму Торнадо, чтобы узнать, есть ли у нее определенные ключевые слова. Обычно я делал бы это с модулем 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?"

1 Ответ

0 голосов
/ 05 мая 2018

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

def unwrap(func):
    while hasattr(func, '__wrapped__'):
        func = func.__wrapped__
    return func
...