2011-09-04 75 views
2

我想接受一個字典或一個字典列表作爲函數參數。到目前爲止,我已經想出了下面,但我懷疑我已經錯過了一些東西完全明顯,而正在使用的東西易碎(isinstance):接受單字典或字典列表作爲函數參數

def wrap(f): 
    def enc(inp): 
     if isinstance(inp, list): 
      for item in inp: 
       f(item) 
     else: 
      f(inp) 
    return enc 

@wrap 
def prt(arg): 
    # do something with the dict 
    print arg.keys() 
+2

不要光想着在列表中。一系列的字典也可以作爲元組,集合甚至是生成器表達式傳遞,並且函數中的相同代碼可以安全地遍歷它們中的任何一個。 – PaulMcG

回答

3

我會接受可變數量的參數:

def wrap(f): 
    def enc(*args): 
     for item in args: 
      f(item) 
    return enc 

然後,您可以通過解壓它來傳遞單個字典,多個字典或列表。

請參閱Python教程中的Arbitrary Argument Lists

+1

如果你打算把它們放在地板上,那麼沒有任何一點可以接受'kwargs'。 –

+0

@Ned:真的,我想這是習慣...被刪除。 –

+0

但是如果'f'期待一個字典,那就行不通了。 – urschrei

2

我會避免使用裝飾,我想它會更容易處理您ptr功能的邏輯:

def prt(arg): 
    try: 
     # we'll try to use the dict... 
     print arg.keys() 
    except AttributeError: 
     # ok that didn't work, we have a list of dicts 
     for d in arg: 
      print d.keys()