Новое для Python и попытка понять разницу между этими двумя декораторами, в которых декоратор A принимает в качестве аргумента функцию, которую он украшает, и декоратор B, кажется, передает украшенную функцию функции внутри себя.Понимание различий между этими двумя декораторами
декоратор А:
def my_decorator(some_function):
def wrapper():
print "Something is happening before some_function() is called."
some_function()
print "Something is happening after some_function() is called."
return wrapper
@ my_decorator
def just_some_function():
print "Wheee!"
Будет производить:
Something is happening before some_function() is called.
Wheee!
Something is happening after some_function() is called.
None
декоратор Б:
def decorator_factory(enter_message, exit_message):
def simple_decorator(f):
def wrapper():
print enter_message
f()
print exit_message
return wrapper
return simple_decorator
@decorator_factory("Start", "End")
def hello():
print "Hello World"
Будет производить:
Start
Hello World
End
None
Я понимаю, как с Decorator A, some_function()
можно передать def wrapper()
, потому что my_decorator()
принимает some_function
в качестве аргумента.
Но с Decorator B, как это, что simple_decorator(f)
получает значение, возвращаемое def hello()
(как f
), когда decorator_factory()
принимает "start"
и "End"
как его аргументы и не def hello()
? Как Python «знает», казалось бы, автоматически передает def hello()
в simple_decorator()
?
'@decorator_factory (...)' - вызов функции. Результат этого вызова функции затем применяется к украшенной функции;) –