Я пытаюсь изучить декораторы и преодолеть странное состояние, имея несколько декораторов для метода. У меня есть два декоратора @makeupper
и @decorator_maker_with_arguments
.Python - Несколько декораторов для работы с ошибкой
@decorator_maker_with_arguments
демонстрирует доступ к аргументам внутри декоратора. Это отлично работает, печатая прилагаемые аргументы, но я вижу, что @makeupper
неисправен. Он печатает None
. Я поставил оператор печати рядом с его определением метода, чтобы увидеть, если его вызываемый и напечатанный, но никогда не печатает буквы в hello() в верхнем регистре.
Когда я прокомментирую @decorator_maker_with_arguments("swadhikar", "c")
Я вижу @makeupper
работает хорошо. Может кто-нибудь объяснить, что я запутываю здесь?
def makeupper(some_fun):
def wrapper(arg1, arg2):
return some_fun(arg1, arg2).upper()
return wrapper
def decorator_maker_with_arguments(decorator_arg1, decorator_arg2):
"""Decorator make that demonstrates decorators with arguments"""
print "I am a decorator maker and you passed \"{}:{}\" while calling me...".format(decorator_arg1, decorator_arg2)
def my_decorator(fn):
def wrapper(fn_arg1, fn_arg2):
print "I am the wrapper and I can access the method args \"{}:{}\"".format(fn_arg1, fn_arg2)
return wrapper
return my_decorator
@decorator_maker_with_arguments("swadhikar", "c")
@makeupper
def hello(ar1, ar2):
return "Hello User!"
Результат:
I am a decorator maker and you passed "swadhikar:c" while calling me...
I am the wrapper and I can access the method args "hello_arg1:another hello arg..."
None
ваша функция упаковщик внутри 'decorator_maker ... на самом деле не называют декорированного функции - это то, что предназначено? –
@ TonySuffolk66 хорошо - на самом деле он ничего не возвращает, поэтому 'None' ... –
Код ведет себя корректно, непонятно, почему вы ожидали, что' 'Hello User!" 'Будет напечатан. После того, как вы примените внешний декоратор, 'fn' (в этот момент фактически' wrapper' из 'makeupper') не получает вызов. – jonrsharpe