开发者

How to change a function's return using a decorator?

开发者 https://www.devze.com 2023-03-31 11:51 出处:网络
I want create a decorator to change a function\'s return value like that, How to do that like below?:

I want create a decorator to change a function's return value like that, How to do that like below?:

def dec(func):
    def wrapper():
        #some code...
        #change return value append 'c':3
    return wrapper

@dec
def foo():
    return {'a':1,开发者_运维百科 'b':2}

result = foo()
print result
{'a':1, 'b':2, 'c':3}


Well.... you call the decorated function and change the return value:

def dec(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        result['c'] = 3
        return result
    return wrapper


I'll try to be fairly general here since this is probably a toy example, and you might need something parameterized:

from collections import MutableMapping

def map_set(k, v):
    def wrapper(func):
        def wrapped(*args, **kwds):
            result = func(*args, **kwds)
            if isinstance(result, MutableMapping):
                result[k] = v 
            return result
        return wrapped
    return wrapper

@map_set('c', 3)
def foo(r=None):
    if r is None:
        return {'a':1, 'b':2}
    else:
        return r

>>> foo()
{'a': 1, 'c': 3, 'b': 2}

>>> foo('bar')
'bar'
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号