Mad*_*ist 3 python decorator conditional-statements
是否可以根据条件修饰函数?
翼:
if she.weight() == duck.weight():
@burn
def witch():
pass
Run Code Online (Sandbox Code Playgroud)
我只是想知道,如果逻辑可以使用(当witch被调用?)要弄清楚是否要装饰witch用@burn?
如果没有,是否可以在装饰器中创建条件以达到相同的效果?(witch被称为未修饰的.)
Cla*_*diu 10
你可以创建一个'有条件'装饰器:
>>> def conditionally(dec, cond):
def resdec(f):
if not cond:
return f
return dec(f)
return resdec
Run Code Online (Sandbox Code Playgroud)
用法示例如下:
>>> 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()
Run Code Online (Sandbox Code Playgroud)
小智 5
可以通过重新分配来启用/禁用装饰器。
Run Code Online (Sandbox Code Playgroud)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"
装饰器只是用于重新定义函数的语法糖,例如:
def wrapper(f):
def inner(f, *args):
return f(*args)
return lambda *args: inner(f, *args)
def foo():
return 4
foo = wrapper(foo)
Run Code Online (Sandbox Code Playgroud)
这意味着你可以在语法糖存在之前以旧方式完成:
def foo():
return 4
if [some_condition]:
foo = wrapper(foo)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3845 次 |
| 最近记录: |