Python3 decorating conditionally?

后端 未结 3 1030
滥情空心
滥情空心 2021-01-01 06:27

Is it possible to decorate a function based on a condition?

a\'la:

if she.weight() == duck.weight(): 
    @burn
def witch():
    pass
相关标签:
3条回答
  • 2021-01-01 07:13

    You can create a 'conditionally' decorator:

    >>> def conditionally(dec, cond):
        def resdec(f):
            if not cond:
                return f
            return dec(f)
        return resdec
    

    Usage example follows:

    >>> 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()
    
    0 讨论(0)
  • 2021-01-01 07:16

    It is possible to enable/disable decorators by reassignment.

    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"
    
    0 讨论(0)
  • 2021-01-01 07:19

    Decorators are just syntactical sugar for re-defining the function, ex:

    def wrapper(f):
        def inner(f, *args):
            return f(*args)
        return lambda *args: inner(f, *args)
    
    def foo():
        return 4
    foo = wrapper(foo)
    

    Which means that you could do it the old way, before the syntactical sugar existed:

    def foo():
        return 4
    if [some_condition]:
        foo = wrapper(foo)
    
    0 讨论(0)
提交回复
热议问题