装饰器如何在没有正式调用的情况下注册函数?

2024-04-24 09:09:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在看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已经包含了这两个函数。我习惯于认为装饰器是应用的,而函数是显式调用的,但是这个例子告诉我我错了。发生这种情况是因为register函数不调用func吗?但是如果它真的打电话呢?这是一个需要记住的特殊情况,还是背后有某种制度


Tags: 函数nameregisterhelloreturndef情况plugins
1条回答
网友
1楼 · 发布于 2024-04-24 09:09:59
@register
def say_hello(name):
    return f"Hello {name}"

相当于:

def say_hello(name):
    return f"Hello {name}"

say_hello = register(say_hello)

相关问题 更多 >