如何在从闭包的 return 值创建的函数上使用 Decorator?

How to use Decorator on function which was created from a the return value of a closure?

我有以下装饰器:

def msg_factory(*, prefix: str, **styles: Dict[str, Any]):
    def decorator_msg_factory(func):
        @functools.wraps(func)
        def wrapper_msg_factory(*args, **kwargs):
            msg = func(*args, **kwargs)
            return typer.echo(f"{typer.style(prefix, **styles)}: {msg}")

        return wrapper_msg_factory

    return decorator_msg_factory



error_msg = msg_factory(prefix="ERROR", fg=typer.colors.BLACK, bg=typer.colors.RED)
warn_msg = msg_factory(prefix="WARN", fg=typer.colors.BLACK, bg=typer.colors.YELLOW)
info_msg = msg_factory(prefix="INFO", fg=typer.colors.BLACK, bg=typer.colors.GREEN)

我可以这样使用它:

@info_msg
def init_template_created_successfully() -> str:
    msg_0 = "sdasdasd:\n\n"
    msg_1 = "1. dasdasd\n"
    return msg_0 + msg_1

这工作正常,但我想为这样的消息使用工厂函数:

def create_multiline_message_function(*messages: str) -> str:
    def multiline_string():
        return "\n".join(messages)

    return multiline_string



init_template_created_successfully = create_multiline_message_function(
    "1. sdasda",
    "2. sdasda"
)

不幸的是,这不起作用并导致 syntax Error。我的方法可能吗?如果是,如何?

@info_msg
init_template_created_successfully 

Python 装饰器是 syntax-sugar,所以

@mydecorator
def myfunction():
    ...

等同于

def myfunction():
    ...
myfunction = mydecorator(myfunction)

如您所见,后者可能独立于 def 应用。如需进一步讨论,请参阅 PEP 318