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

22,188

Solution 1

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

Solution 2

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'
Share:
22,188
Admin
Author by

Admin

Updated on October 11, 2020

Comments

  • Admin
    Admin over 3 years

    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}