使用新版本的库我改变了几个函数的一个默认参数。因此,我想添加一个临时警告,当用户调用没有明确指定参数的函数时会发生这种警告(因此调用函数时会显示默认值)。
只需添加警告功能并在每个基本功能中调用它即可轻松完成:
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
当我在没有my_function
参数的情况下调用formatting
并且formatting
被指定为关键字参数时,该工作正常。
但是如何包含仅使用位置参数调用my_function
的可能性?由于my_function('arg1', 'arg2', 'some_format')
参数的重复,调用已装饰的TypeError
将生成formatting
。
注意:我不能假设formatting
总是第3个参数,因为我需要装饰不同的函数。我也无法更改参数顺序以保持向后兼容性。
答案 0 :(得分:1)
在python 3中,您可以使用inspect模块' 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