[英]Decorator that changes certain argument of function
在使用新版本的库时,我更改了几个函数的默认参数之一。 因此,我想添加一个临时警告,该警告在用户调用没有显式指定参数的函数时发生(因此函数以其默认值调用)。
只需添加警告函数并在每个基本函数中调用它即可轻松完成:
def warning(formatting):
if formatting is None:
sys.stderr.write("WARNING: The default format has changed to new_format")
return 'new_format'
return formatting
def my_function(arg1, arg2, formatting=None):
formatting = warning(formatting)
... # the following function code
但是,使用装饰器(出于代码可读性)来进行操作会更加方便。 所以我实现了这样的事情:
def check_default_format(fun):
def warning(*a, **kw):
if 'formatting' not in kw.keys() or kw['formatting'] is None:
kw['formatting'] = 'new_format'
sys.stderr.write("WARNING: The default format has changed to new_format")
return fun(*a, **kw)
return warning
@check_default_format
def my_function(arg1, arg2, formatting=None):
... # the function code
当我不带formatting
参数的情况下调用my_function
且将formatting
指定为关键字参数时,该方法将按预期工作。 但是如何包含仅使用位置参数才能调用my_function
的可能性? 调用修饰的my_function('arg1', 'arg2', 'some_format')
将由于重复formatting
参数而产生TypeError
。
注意:我不能假设formatting
始终是第3个参数,因为我需要装饰不同的功能。 我也无法更改参数顺序以保持向后兼容性。
在python 3中,您可以使用检查模块的Signature.bind_partial
:
def check_default_format(fun):
@wraps(fun)
def wrapper(*a, **kw):
sig= inspect.signature(fun)
args= sig.bind_partial(*a, **kw)
if 'formatting' not in args.arguments or args.arguments['formatting'] is None:
kw['formatting'] = 'new_format'
sys.stderr.write("WARNING: The default format has changed to new_format")
return fun(*a, **kw)
return wrapper
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.