在函数参数python中传递多个字典

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在函数参数python中传递多个字典相关的知识,希望对你有一定的参考价值。

我有一个函数,它需要多个字典作为参数。我遇到了Syntax的问题​​,因为我不断收到以下消息:

SyntaxError: non-keyword arg after keyword arg

本质上,我的代码将遍历file_names列表中的每个项目,并获取每个要在compare()函数上传递的文件大小。我在传递多个词典时遇到问题。每个字典有两个键,它们是文件名和文件大小。我的代码如下:

def compare(previous,current):

    tolerance = 0.4

    if previous is None and current is None:
        return " missing in both"

    if previous is None:
        return " new"

    if current is None:
        return " missing"

    size_ratio = float(current)/previous

    if size_ratio >= 1 + tolerance:
        return " %d%% bigger" % round(((size_ratio - 1) * 100),0)

    if size_ratio <= 1 - tolerance:
        return " %d%% smaller" % round(((1 - size_ratio) * 100),0)

    return " ok"


def compare_filesets(file_names, previous_data, current_data):


    for item in file_names:

     print (item + compare(previous_data.get('File Size'), current_data.get('File Size')) + "\n")



compare_filesets(file_names=['a.json', 'b.json', 'c.json'],
                 current_data= {"File Name": "a.json", "File Size": 1000}, {"File Name": "a.json", "File Size": 1000},
                 previous_data={"File Name": "a.json", "File Size": 1000}, {"File Name": "a.json", "File Size": 1000})
答案

一个参数是一个单独的对象,所以func(arg1={}, {})没有将两个dicts作为“arg1”传递,而一个dict作为(命名参数)“arg1”而第二个作为位置参数 - 正如你所注意到的那样,python禁止在命名之后传递位置参数(因为它无法知道位置参数匹配的参数)。

如果你想传递多个dict作为“previous_data”和“current_data”,你必须传递一个dict集合(在这个cas中一个列表是非常明显的选择),即:

somefunc(a=[{}, {}], b=[{}, {}])

现在这也意味着你必须(重新)编写你的函数,以便它需要dicts列表,而不是dicts。

以上是关于在函数参数python中传递多个字典的主要内容,如果未能解决你的问题,请参考以下文章

20 Python - 函数应用与工具

python 函数参数的传递(参数带星号的说明) 元组传递 字典传递

Python - 如何使用池映射传递多个参数 [重复]

Python代码阅读(第19篇):合并多个字典

Python ❀ 函数

在循环中在python中传递多个参数