ответ Blckknght является большим, если вы хотите сделать проверку каждый раз, когда вы вызываете функцию, но если у вас есть параметр, который вы можете прочитать один раз и никогда не будет изменен, вы можете не захотеть проверять этот параметр каждый раз, когда вызывается декорированная функция. В некоторых из наших высокопроизводительных демонов на работе я написал декоратор, который проверяет файл настроек один раз, когда первый файл python загружается и решает, следует ли его обертывать или нет.
Вот пример
def timed(f):
def wrapper(*args, **kwargs):
start = datetime.datetime.utcnow()
return_value = f(*args, **kwargs)
end = datetime.datetime.utcnow()
duration = end - start
log_function_call(module=f.__module__, function=f.__name__, start=__start__, end=__end__, duration=duration.total_seconds())
if config.get('RUN_TIMED_FUNCTIONS'):
return wrapper
return f
Предполагая, что log_function_call регистрирует ваш вызов к базе данных, логфайл, или независимо от того, что и config.get («RUN_TIMED_FUNCTIONS») проверяет глобальную конфигурацию, затем добавить @timed декоратора функция будет проверять один раз при загрузке, чтобы увидеть, если вы синхронизируете этот сервер, среду и т. д., а если нет, то это не изменит выполнение функции на производстве или в других средах, в которых вы заботитесь о производительности.
Спасибо! Раздел комментариев не форматируется, поэтому я добавил образец кода к исходному ответу. Можете ли вы объяснить, почему функция синхронизации не называется? – cfpete
Декоратор применяется во время импорта, поэтому переменные экземпляра в настоящее время не консультируются. Вам нужно будет написать для этого другой декоратор, который проверяет себя при вызове. Вне области для этого формата Q и комментариев. :-) –
Как использовать его, если я хочу использовать это на основе классов, то есть на основе Django Class. Там мы должны использовать 'method_decorator'. Как сделать этот код совместимым с этим? – PythonEnthusiast