2013-10-03 2 views
0

У меня есть декоратор под названием Timer, теперь в идеале использовать декоратор так:По требованию декоратора?

@Timer 
def function(...): 
    return None 

Однако это требует таймер все времяfunction называется. Теперь, конечно, вы можете использовать декоратор как обычная функцию, чтобы сделать это, когда вы хотите вызвать его под конкретным экземпляром:

function = Timer(function) 

Однако, это не выглядит очень (я придирчив, я знаю) , Итак, есть ли способ обернуть декоратор над функцией, чтобы сказать все варианты использования в тестовом файле или что-то еще? Так, что-то вроде:

from app import cheese 

@Timer # Syntax error 
cheese # Syntax error 

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

+1

декоратора синтаксиса может быть использован только до 'def' и' class'. есть ли какая-то причина, по которой вы не можете просто использовать desugared вариант? – SingleNegationElimination

+0

@dequestarmappartialsetattr Нет, просто так, что он не выглядит очень красивым в моем коде, и если бы был лучший способ сделать это, тогда я хотел бы знать. –

+0

Я могу только * предположить *, это нацелено на какой-то конкретный протокол обработки вызовов, указывающий на использование прецедента в таких случаях. Вероятно, это может быть сделано (для вашего собственного кода), в котором задействованы некоторые грязные фреймы стека и с некоторым временным штрафом (который может быть исключен из данных о производительности). OTOH, для этого есть крючки профиля. – jhermann

ответ

1

Если вы можете включить/отключить в верхней части файла (то есть вы знаете, когда вы загружаете файл, хотите ли вы их включить или нет), вы можете использовать Enable/Disable Decorator.

если нет ... вы не разместили источник для декоратора, но нет причин, чтобы он не мог ссылаться на глобальную переменную для включения/выключения самого кода упаковки. т.е. декоратор выглядит следующим образом:

@simple_decorator 
def my_simple_logging_decorator(func): 
    def you_will_never_see_this_name(*args, **kwargs): 
     print 'calling {}'.format(func.__name__) 
     return func(*args, **kwargs) 
    return you_will_never_see_this_name 

(от https://wiki.python.org/moin/PythonDecoratorLibrary)

Просто добавьте в щитке для добавленного кода т.е.

@simple_decorator 
def my_simple_logging_decorator(func): 
    def you_will_never_see_this_name(*args, **kwargs): 
# Added/modified code starts here 
     if globalvar: 
      print 'calling {}'.format(func.__name__) 
# End modified code 
     return func(*args, **kwargs) 
    return you_will_never_see_this_name