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'
![Admin](/assets/logo_square_200-5d0d61d6853298bd2a4fe063103715b4daf2819fc21225efa21dfb93e61952ea.png)
Author by
Admin
Updated on October 11, 2020Comments
-
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}