1

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

4

3 回答 3

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")
)
于 2013-09-24T13:32:22.567 回答
1

这在 Python 中是不可能的。关键字参数被传递到一个字典中,所以必须是唯一的

于 2013-09-24T13:25:51.350 回答
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不适合该模式的内容都可以放在字典中**kwargs。一个更强大的答案是创建一个类或namedtuple按照其他评论的建议创建一个类。

于 2013-09-24T13:44:18.657 回答