Найти все оформленные функции в модуле - PullRequest
7 голосов
/ 27 января 2010

Можно ли узнать, оформлена ли функция во время выполнения? Например, могу ли я найти все функции в модуле, которые украшены «примером»?

@example
def test1():
    print "test1"

Ответы [ 5 ]

9 голосов
/ 27 января 2010

В общем случае это невозможно, потому что декоратор example может не оставить следов, которые можно обнаружить во время выполнения - например, может быть

def example(f):
  return f

Если вы управляете источником для example, конечно, легко сделать его отмеченным или записать функции, которые он украшает; если вы этого не сделаете, может быть совершенно невозможно делать то, что вы хотите.

8 голосов
/ 27 января 2010

Поскольку вы указали, что у вас есть контроль над кодом оболочки, вот пример:

def example(f):
    f.wrapped = True
    return f

@example
def test1():
    print "test1"

def test2():
    print "test2"


print test1.wrapped
print hasattr(test2, 'wrapped')
3 голосов
/ 27 января 2010

Я не думаю, что есть общий способ, поскольку декоратор - это простой вызов функции. Ваш код идентичен этому:

def test1():
    print "test1"

test1 = example(test1)

Вероятно, вы можете обнаружить определенные декораторы, разобрав и проанализировав (используя модуль dis). Или вы можете просто разобрать исходный файл, хотя это немного уродливо.

Почему вы хотите обнаружить их в первую очередь?

0 голосов
/ 07 мая 2011

Вы можете найти, что этот последний вопрос содержит подробную информацию о 3 способах сделать это:

Как получить все методы класса Python с данным декоратором

0 голосов
/ 27 января 2010

Если вы можете, monkeypatch декоратор во время выполнения, чтобы узнать, какие функции передаются ему:

decfuncs = []

def decpatch(dec):
  def catchdec(func, *args, **kwargs):
    decfuncs.append(func)
    return dec(func, *args, **kwargs)
  return catchdec

somemodule.somedecorator = decpatch(somemodule.somedecorator)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...