Рассмотрим этого модуля:Использования декорированной функции по умолчанию аргументов функции
#mymodule.py
import logging
def print_start_end(name):
"""
Decorator that creates a logger and logs the start
and the end of the function call
"""
def decorator(f):
logger = logging.getLogger(name)
def wrapper(*args, **kwargs):
logger.info("start")
res = f(*args, **kwargs)
logger.info("end")
return res
return wrapper
return decorator
@print_start_end(__name__)
def f(x):
return x
def g(y=f(3)):
return y
И пример сценарий:
import logging
from mymodule import f
logger = logging.getLogger("")
logger.setLevel(logging.INFO)
h = logging.StreamHandler()
h.setLevel(logging.INFO)
logger.addHandler(h)
print f(3)
Выход:
start
end
3
декоратор работает. Но теперь я пишу сценарий, чтобы использовать g
вместо f
:
import logging
from mymodule import g
logger = logging.getLogger("")
logger.setLevel(logging.INFO)
h = logging.StreamHandler()
h.setLevel(logging.INFO)
logger.addHandler(h)
print g()
Выход:
3
При выполнении оператора print g()
, вызов f
был успешным, поскольку он напечатал ожидаемое значение возврата 3. Но почему он не печатает «начало» и «конец»?
Это ваш регистратор, я почти полностью уверен. Причина, по которой я говорю, что если вы добавите инструкцию печати в оболочку, вы увидите, что она вызвана для f (3). –