2011-09-04 117 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()