我如何在装饰器和装饰函数之间获得相同/传递的参数? [英] How can I get the same/to pass parameters between decorator and decorated function?
问题描述
在这种情况下,我想将_source_dir_abs:str
传递给装饰器.
In this case I want to pass _source_dir_abs:str
into decorator.
我试图模仿Flask进行路由的相同过程,该过程将参数从装饰器传递给装饰器.但这会使参数解释为文字字符串,而不是变量.
I tried to mimic the same process that Flask has for routing to pass parameter from decorator to function it is decorated. But this makes the parameter interpreted as a literal string and not as a variable.
@dec_check_abs("<_source_dir_abs>")
def walk_return_dir_nofolder(_source_dir_abs:str) -> list:
w = walk(_source_dir_abs)
d = [d for d, fol, fil in w if len(fol) == 0]
return d
我尝试使用@dec_check_abs(_source_dir_abs)
,它返回错误NameError: name 'source_dir_abs' is not defined
I tried with @dec_check_abs(_source_dir_abs)
it returns an error of NameError: name 'source_dir_abs' is not defined
def dec_check_abs(*args_1):
def decorator(_func:FT):
def wrapper(*args_2, **kwargs):
for i in args_1:
if not check_abs(i):
"""Raise warning."""
napw()
if _func.__annotations__["return"] == bool:
return False
else:
return None
return _func(*args_2, **kwargs)
return wrapper
return decorator
推荐答案
I got my problem answered in a Reddit thread, https://www.reddit.com/r/learnpython/comments/5wnygi/how_can_i_get_the_same_parameters_between/.
这是我的代码.
def dec_check_abs(*params):
def decorator(func):
sig = inspect.signature(func)
def wrapper(*args, **kwargs):
bound = sig.bind(*args, **kwargs)
for param in params:
val = bound.arguments[param]
if not check_abs(val):
"""Raise warning."""
napw()
if sig.return_annotation == bool:
return False
else:
return None
return func(*args, **kwargs)
return wrapper
return decorator
@dec_check_abs("source_dir_abs")
def check_isfolder(source_dir_abs:str) -> bool:
return os.path.isdir(source_dir_abs)
@dec_check_abs("source_dir_abs", "dest_dir_abs")
def copy_fileorfolder(source_dir_abs:str, dest_dir_abs:str) -> bool:
shutil.copy2(source_dir_abs, dest_dir_abs)
return True
这篇关于我如何在装饰器和装饰函数之间获得相同/传递的参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!