Я смотрю на один из примеров из здесь , в частности на следующий:
import random
PLUGINS = dict()
def register(func):
"""Register a function as a plug-in"""
PLUGINS[func.__name__] = func
return func
@register
def say_hello(name):
return f"Hello {name}"
@register
def be_awesome(name):
return f"Yo {name}, together we are the awesomest!"
def randomly_greet(name):
greeter, greeter_func = random.choice(list(PLUGINS.items()))
print(f"Using {greeter!r}")
return greeter_func(name)
Меня поражает то, что ни say_hello()
, ни be_awesome()
не функционируютВызываются до самой последней строки, но PLUGINS
уже содержит их обоих. Я привык думать, что декораторы применяются , тогда как функции вызываются явно, но этот пример говорит мне, что я ошибся. Это происходит потому, что функция register
не вызывает func
? Но что если он позвонит? Это особый случай, чтобы помнить, или за этим стоит какая-то система?