可变长度参数的方法签名

时间:2013-09-24 13:22:39

标签: python

我想创建一个方法,一个元组后跟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是元组。

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,如其他评论所建议的那样。