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

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

Начиная с торнадо 4, gen.coroutine сохраняет исходную функцию в атрибут __wrapped__, и вы можете ее проверить: inspect.getargspec(f.b.__wrapped__) # ArgSpec(args=['self', 'x', 'y'], varargs=None, keywords=None, defaults=(None,))

Gennady Kandaurov 03.05.2018 15:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Другие вопросы по теме