将多个字典作为参数传递给函数

时间:2014-06-22 21:08:29

标签: python dictionary arguments

我有两本词典:

SP = dict{'key1': 'value1','key2': 'value2'}
CP = dict{'key1': 'value1','key2': 'value2'}

我有一个函数,想把这两个字典作为输入,但我不知道该怎么做。

我试过了:

def test(**SP,**CP):
    print SP.keys(),CP.keys()

test(**SP,**CP)

通过对两个词典进行大量修改,真正的功能将变得更加复杂。 但简单的测试功能对我不起作用:(

8 个答案:

答案 0 :(得分:5)

如果您只想将两个词典作为单独的参数,请执行

def test(SP, CP):
    print SP.keys(),CP.keys()

test(SP, CP)

如果要将字典的各个键/值对作为单独的关键字参数传递,则只能使用**。如果您将整个字典作为单个参数传递,则只需传递它,就像使用任何其他参数值一样。

答案 1 :(得分:4)

如果要将两个不同的词典传递给两个都包含函数参数的函数,则应首先合并两个词典。

例如:

dicA = {'spam':3, 'egg':4}
dicB = {'bacon':5, 'tomato':6}

def test(spam,tomato,**kwargs):
    print spam,tomato

#you cannot use:
#test(**dicA, **dicB)

所以你必须合并两个词典。有几个选项:请参阅How to merge two Python dictionaries in a single expression?

dicC = dicA.copy()
dicC.update(dicB)

#so now one can use:
test(**dicC)

>> 3 6

答案 2 :(得分:2)

您可以使用 dict 构造函数将两个词典( SP CP )组合在一个词典中。

test(**dict(SP,**CP))

答案 3 :(得分:0)

使用*args获取多个参数。

SP={'key1':'value1','key2':'value2'}  `dict{'key1':'value1','key2':'value2'}` 
CP={'key1':'value1','key2':'value2'}

def test(*args):
    for arg in args:
        print arg.keys(),

test(SP,CP)
['key2', 'key1'] ['key2', 'key1']

答案 4 :(得分:0)

def merge(*d):
   r={}
   for x in d:r.update(x)
   return r

d1={'a': 1, 'b': 2}
d2={'y': 4, 'x': 3}

def f(**k): print(k)

f(**merge(d1,d2))   # you're on your own if keys repeat unintentionally

提供 {'a':1,'y':4,'b':2,'x':3}

答案 5 :(得分:0)

如果您想避免组合词典,请将它们作为参数而不是关键字参数提供,并将其默认设置为某些内容(例如None),并将None转换为{}并以其他方式复制字典。

SP = {'key1': 'value1', 'key2': 'value2'}
CP = {'key1': 'value3', 'key2': 'value4'}

def test(SP=None, CP=None):
    SP = {} if SP is None else SP.copy()
    CP = {} if CP is None else CP.copy()
    # Now use SP and CP as keyword arguments to other functions
    foo(**SP)
    baz(**CP)

def foo(**kws):
    print(kws.items())

def baz(**kws):
    print(kws)

test(SP=SP)
test(CP=CP)
test(SP, CP)

我经常在将关键字参数传递给我的函数中调用的不同绘图函数时执行此操作,并将不同的关键字参数字典发送到这些绘图函数。

答案 6 :(得分:0)

TLDR:通过字典词典

我发现自己也遇到了同样的问题,我无法合并字典,因为我想将每个字典的内容都放在被调用函数中。 我发现的解决方案是使用嵌套字典。

    args = {}
    args['SP'] = dict{'key1': 'value1','key2': 'value2'}
    args['CP'] = dict{'key1': 'value1','key2': 'value2'}

    test(**args)

    def test (**kwargs):
        arg_sp = kwargs.get('SP')
        arg_cp = kwargs.get('CP')

答案 7 :(得分:0)

为什么不起作用:

在Python中,参数中的“ **”前缀用于使一个参数捕获其他多个参数。例如:

SP = {'key1': 'value1','key2': 'value2'}

def test(**kwargs):              #you don't have to name it "kwargs" but that is
    print(kwargs)                #the usual denomination


test(**SP)
test(key1='value1', key2='value2')

测试函数上的两个调用完全相同

用两个**参数定义一个函数是模棱两可的,因此您的解释器不会接受它,但是您不需要它。

如何使其工作:

在使用常规字典参数时,不必使用**:在这种情况下,您可以简单地做到:

SP = {'key1': 'value1','key2': 'value2'}
CP = {'key1': 'value1','key2': 'value2'}

def test(SP,CP):
    print(SP)
    print(CP)

test(SP,CP)

字典是可以直接在参数中使用的对象。需要注意的唯一一点是,如果要保留原始词典,请不要直接修改参数中的字典。