我想创建一个方法,一个元组后跟2个关键字参数一次或多次,然后是其他关键字参数。 例如:
funct(data_1, x='x_val', y='y_val', data_2, x='x_val', y='y_val',
data_3, x='x_val', y='y_val', other_args='other_args_val')
或
funct(data_1, x='x_val', y='y_val', data_2, x='x_val', y='y_val',
data_3, x='x_val', y='y_val')
或
funct(data_1, x='x_val', y='y_val')
或
funct(data_1, x='x_val', y='y_val', other_args='other_args_val')
将是有效的调用,其中data_1,data_2,data_3是元组。
答案 0 :(得分:3)
您可以创建接受任意数量关键字参数的函数:
def foo(**kwargs):
pass
正如你所看到的,这不会让你做你想做的事。
foo(x=None, x=None)
#>>> Traceback (most recent call last):
#>>> File "<string>", line 73, in <module>
#>>> File "/usr/lib/python3.3/ast.py", line 35, in parse
#>>> return compile(source, filename, mode, PyCF_ONLY_AST)
#>>> File "<unknown>", line 4
#>>> SyntaxError: keyword argument repeated
您唯一的选择是创建一个新的输入机制。我建议data, dictionary, data, dictionary, data, dictionary, ...
:
def funct(*args):
...
funct(
data1, {"x": "x_val", "y": "y_val"},
data2, {"x": "x_val", "y": "y_val"},
data3, {"x": "x_val", "y": "y_val", "other_args": "other_args_val"}
)
或者,您可以接受类实例(可能namedtuple
):
funct(
Data(data1, x="x_val", y="y_val"),
Data(data2, x="x_val", y="y_val"),
Data(data3, x="x_val", y="y_val", other_args="other_args_val")
)
答案 1 :(得分:0)
这在Python中是不可能的。关键字args传递给dict,因此必须是唯一的
答案 2 :(得分:0)
正如Veedrac建议的那样,你可以将*args
传递给函数,但参数本身就是元组。当您遍历参数时,可以将它们解压缩为:
def func(*args):
for (data,x,y) in args:
print data,x,y
# Pass a few tuples
func( ('cat',1,2), ('dog',3,5), ('foo',9,-1) )
给
cat 1 2
dog 3 5
foo 9 -1
如果需要,任何其他不适合该模式的args
都可以放在dict **kwargs
中。一个更健全的答案是创建一个类或namedtuple
,如其他评论所建议的那样。