【发布时间】:2019-08-01 17:51:00
【问题描述】:
我有一种情况,我正在编写表单的许多函数
def func(arg):
arg=pre_process(arg)
return do_work(arg)
我希望能够以更简单的方式对 arg 进行预处理。我尝试使用如下示例中的装饰器
from typing import Callable
def super_decorator(arg_name: str, pre_fn: Callable) -> Callable:
def decorator(fn):
def inner(*args, **kwargs):
assert arg_name in kwargs.keys()
kwargs[arg_name] = pre_fn(arg_name)
return fn(*args, **kwargs)
return inner
return decorator
#example
def pre_processor(x):
return "pre-processed"
@super_decorator("arg1", pre_processor)
def func(*, arg1=None):
return arg1
print(func(arg1="hello world"))
使用这种技术我得到了正确的输出
pre-processed
但是这有点 hacky,我必须强制关键字参数。有没有更好的办法?
【问题讨论】:
-
必须强制关键字参数是什么意思?
-
如果预处理的参数不固定为第一个(或第二个等)位置参数,您只需要关键字参数。
-
好点,我猜不是使用关键字参数,而是将参数的索引与预处理器函数一起传递给最外层的装饰器并这样做。
标签: python python-3.x python-decorators