我正在查看here中的一个示例,尤其是以下示例:
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
已经包含了这两个函数。我曾经认为装饰器是在while上应用的,这些函数是显式调用的,但是这个例子告诉我我错了。是否因为register
函数未调用func
而发生?但是,如果调用了该怎么办?这是要记住的特殊情况还是背后有某些系统?
@register
def say_hello(name):
return f"Hello {name}"
等效于:
def say_hello(name):
return f"Hello {name}"
say_hello = register(say_hello)