2011-08-26 51 views
6

我想創建一個裝飾來改變這樣的一個函數的返回值,如何做到這一點像下面?:如何用python中的裝飾器修改函數的返回值?

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} 

回答

21

嗯....你叫裝飾功能和改變返回值:

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

我會盡量相當普遍的在這裏,因爲這可能是一個玩具例子,你可能需要一些參數:

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

是的!它的工作。更多的你添加一個mutableMapping檢查。它是很大的。 – libaoyin

相關問題