装饰器如何在不进行正式调用的情况下注册功能?

问题描述 投票:0回答:1

我正在查看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而发生?但是,如果调用了该怎么办?这是要记住的特殊情况还是背后有某些系统?

python decorator python-decorators
1个回答
1
投票
@register
def say_hello(name):
    return f"Hello {name}"

等效于:

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

say_hello = register(say_hello)
© www.soinside.com 2019 - 2024. All rights reserved.