如何在从闭包的 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。
我有以下装饰器:
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。