Python 蟒蛇3有条件地装饰?
是否可以根据条件来装饰功能 阿拉: 我只是想知道是否可以使用逻辑(当调用Python 蟒蛇3有条件地装饰?,python,conditional-statements,decorator,Python,Conditional Statements,Decorator,是否可以根据条件来装饰功能 阿拉: 我只是想知道是否可以使用逻辑(当调用witch时)来确定是否用@burn装饰witch 如果没有,是否可以在装饰器中创建一个具有相同效果的条件?(witch被称为未修饰的。)可以通过重新分配来实现 您可以创建“有条件”装饰器: >>> def conditionally(dec, cond): def resdec(f): if not cond: return f return
witch
时)来确定是否用@burn
装饰witch
如果没有,是否可以在装饰器中创建一个具有相同效果的条件?(witch
被称为未修饰的。)可以通过重新分配来实现
您可以创建“有条件”装饰器:
>>> def conditionally(dec, cond):
def resdec(f):
if not cond:
return f
return dec(f)
return resdec
用法示例如下:
>>> def burn(f):
def blah(*args, **kwargs):
print 'hah'
return f(*args, **kwargs)
return blah
>>> @conditionally(burn, True)
def witch(): pass
>>> witch()
hah
>>> @conditionally(burn, False)
def witch(): pass
>>> witch()
装饰器只是重新定义函数的语法糖,例如:
def wrapper(f):
def inner(f, *args):
return f(*args)
return lambda *args: inner(f, *args)
def foo():
return 4
foo = wrapper(foo)
这意味着你可以用旧的方法,在语法糖存在之前:
def foo():
return 4
if [some_condition]:
foo = wrapper(foo)
+1我更喜欢这个而不是我的解决方案,因为它与decorator主题保持一致,而且看起来非常干净。这是一个古老的答案,但是有人知道如何使用此模式将参数传递给有条件包装的decorator吗?
def wrapper(f):
def inner(f, *args):
return f(*args)
return lambda *args: inner(f, *args)
def foo():
return 4
foo = wrapper(foo)
def foo():
return 4
if [some_condition]:
foo = wrapper(foo)