Как декоратор может зарегистрировать функцию без формального вызова? - PullRequest
1 голос
/ 09 октября 2019

Я смотрю на один из примеров из здесь , в частности на следующий:

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? Но что если он позвонит? Это особый случай, чтобы помнить, или за этим стоит какая-то система?

1 Ответ

3 голосов
/ 09 октября 2019
@register
def say_hello(name):
    return f"Hello {name}"

эквивалентно:

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

say_hello = register(say_hello)
...