Python3 条件装饰器?
有没有可能根据某个条件来给一个函数加装饰?
就像这样:
if she.weight() == duck.weight():
@burn
def witch():
pass
我在想,能不能在调用witch
的时候用一些逻辑来判断是否要给witch
加上@burn
这个装饰?
如果不行,那有没有办法在装饰器内部创建一个条件,达到同样的效果?(也就是说,调用witch
的时候不加装饰。)
3 个回答
6
装饰器其实就是一种语法上的简化,让我们可以更方便地重新定义函数,比如:
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)
8
可以通过重新赋值来 启用或禁用装饰器。
def unchanged(func): "This decorator doesn't add any behavior" return func def disabled(func): "This decorator disables the provided function, and does nothing" def empty_func(*args,**kargs): pass return empty_func # define this as equivalent to unchanged, for nice symmetry with disabled enabled = unchanged # # Sample use # GLOBAL_ENABLE_FLAG = True state = enabled if GLOBAL_ENABLE_FLAG else disabled @state def special_function_foo(): print "function was enabled"
14
你可以创建一个“条件性”的装饰器:
>>> 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()