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






В стандартной библиотеке Python 2 нет ничего, что могло бы это сделать (но, как вы заметили, в Python 3 он работает нормально). Вам нужно будет получить доступ к атрибуту __wrapped__ самостоятельно. Как было предложено в Ответ Мартин Питерс на аналогичный вопрос, вы можете использовать копию функции inspect.unwrap из Python 3 или упрощенную версию, например
def unwrap(func):
while hasattr(func, '__wrapped__'):
func = func.__wrapped__
return func
Начиная с торнадо 4,
gen.coroutineсохраняет исходную функцию в атрибут__wrapped__, и вы можете ее проверить:inspect.getargspec(f.b.__wrapped__) # ArgSpec(args=['self', 'x', 'y'], varargs=None, keywords=None, defaults=(None,))