Python 使用装饰器检查可选参数
我试图弄清楚如何编写一个装饰器来检查函数是否是用特定的可选参数调用的。这可能不是检查参数的python方法,但我想知道使用decorator的解决方案。下面是我正在寻找的一个例子:Python 使用装饰器检查可选参数,python,decorator,optional-parameters,python-decorators,Python,Decorator,Optional Parameters,Python Decorators,我试图弄清楚如何编写一个装饰器来检查函数是否是用特定的可选参数调用的。这可能不是检查参数的python方法,但我想知道使用decorator的解决方案。下面是我正在寻找的一个例子: @require_arguments("N", "p") # Question here def g(x,*args,**kwargs): if "N" not in kwargs: raise SyntaxError("missing N") if "p" not in kwargs: rais
@require_arguments("N", "p") # Question here
def g(x,*args,**kwargs):
if "N" not in kwargs: raise SyntaxError("missing N")
if "p" not in kwargs: raise SyntaxError("missing p")
print x
g(3,N=2) # Raise "missing p"
如何编写decorator@require_arguments(*args)
,它将引发相应的错误?给您:
def require_arguments(*reqargs):
def decorator(func):
def wrapper(*args, **kwargs):
for arg in reqargs:
if not arg in kwargs:
raise TypeError("Missing %s" % arg)
return func(*args, **kwargs)
return wrapper
return decorator
@require_arguments("N", "p") # Question here
def g(x,*args,**kwargs):
print x
g(3,N=2) # Raise "missing p"
输出:
Traceback (most recent call last):
File "arg.py", line 19, in <module>
g(3,N=2) # Raise "missing p"
File "arg.py", line 7, in wrapper
raise ValueError("Missing %s" % arg)
ValueError: Missing p
回溯(最近一次呼叫最后一次):
文件“arg.py”,第19行,在
g(3,N=2)#升高“缺失的p”
包装器中第7行的文件“arg.py”
提升值错误(“缺少%s”%arg)
ValueError:缺少p
的答案是正确的,我能补充的唯一建议是:
- 用于创建装饰器,这样将保留函数名及其docstring
- 生成所有缺少参数的列表,而不是单个参数。我个人讨厌编译器只是说:“你忘了a”,然后当我添加它时,它仍然抱怨:“你忘了b”等等
装饰者变成:
from functools import wraps
def require_arguments(*reqs):
def decorator(func):
@wraps(func)
def decorated(*args, **kwargs):
missing = [req for req in reqs if req not in kwargs]
if missing:
raise TypeError('missing ' + ', '.join(missing))
return func(*args, **kwargs)
return decorated
return decorator
例子
输出
更好的方法
如果您需要必需的参数,只需将它们显式地放入ask,如:defg(x,N,p)
。您仍然可以调用函数,如g(x=2,N=5,p=3)
,以使代码更具表现力,即使指定参数的顺序不同。但是您将有一个固定的api(这通常是好的),您可以指定参数或使用固定的api顺序
def f(a, b, c):
print a, b, c
f(1, 2, 3) # 1 2 3
f(c=1, b=2, a=3) # 3 2 1
“…引发适当的错误”可能TypeError
,因为这是Python因函数调用中缺少参数而引发的异常?太好了,谢谢!关于@SylvainLeroux,你认为它应该是一个TypeError
吗?@Hooked是的,TypeError可能更合适。
g
just return x
missing N, p
def f(a, b, c):
print a, b, c
f(1, 2, 3) # 1 2 3
f(c=1, b=2, a=3) # 3 2 1