我有一个函数,需要多个字典作为参数。我在收到以下消息时遇到语法问题:
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})
答案 0 :(得分:1)
参数是单个对象,因此func(arg1={}, {})
不会将两个字典传递为“ arg1”,而是将一个字典传递为(命名参数)“ arg1”,将第二个字典传递为位置参数-就像您注意到的那样,python禁止在命名参数之后传递位置参数(因为它不知道位置参数将匹配哪个参数)。
如果要传递多个dict作为“ previous_data”和“ current_data”,则必须传递dict集合(在此cas中,列表是非常明显的选择),即:
somefunc(a=[{}, {}], b=[{}, {}])
现在,这还意味着您必须以这样的方式(重新)编写函数,使其期望字典列表而不是字典列表。