【发布时间】:2017-07-26 09:42:24
【问题描述】:
我正在尝试定义一个装饰器,它只向装饰函数f 添加一个关键字参数。 f 可能有(位置、关键字等)参数的任意组合。我试过这个:
def capture_wrap(f):
def captured(name=False, *args, **kwargs):
"""name can be False, True or str. if str, then use it as a name."""
print (name, f, args, kwargs)
inner = f(*args, **kwargs)
if name is False:
return inner
elif name is True:
return capture(inner)
else:
return capture(inner, name=name)
return captured
如果我尝试将它与接受单个参数的函数一起使用:
@capture_wrap
def any_of(s):
"""s must be in the right format.
See https://docs.python.org/3/library/re.html#regular-expression-syntax ."""
return wrap('[', Dinant(s, escape=False), ']')
0-9A-Fa-f <function any_of at 0x7fb370548a60> () {}
Traceback (most recent call last):
File "./dinant.py", line 222, in <module>
hex = one_or_more(any_of('0-9A-Fa-f'))
File "./dinant.py", line 116, in captured
inner = f(*args, **kwargs)
TypeError: any_of() missing 1 required positional argument: 's'
我收到一个错误,因为 any 参数变成了 captured() 中的 name 参数。我应该怎么做才正确?
【问题讨论】:
-
您能否解释一下“capture()”是什么以及您真正想要实现的目标(=> 您试图用这个解决的问题 - 目前无法解决 - 解决方案)?
-
你能清楚你在 s 中传递了什么以及为什么需要它吗?这将有助于给出更明确的答案
标签: python python-3.x function decorator