Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 蟒蛇3有条件地装饰?_Python_Conditional Statements_Decorator - Fatal编程技术网

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)