gpt4 book ai didi

Python 函数调用中参数传递的排序规则

转载 作者:行者123 更新时间:2023-11-30 22:09:29 25 4
gpt4 key购买 nike

我尝试使用 * 和 ** 将任意数量的参数传递给函数。在 Mark Lutz 撰写的《学习 Python》中,它说首先遵循位置(值)的顺序,然后是关键字参数(名称 = 值)和 * 序列的组合,最后是 **dict。然而,我发现位置参数如果存在的话需要放在第一位,但其余三个在某种程度上可以按顺序混合。
代码keywords3.py:

def     func(a, b=1, *pArgs, **kwArgs): 
print("a = {0}, b = {1}".format(a,b))
print("Positional args = {}".format(pArgs))
print("Keyword args = {}".format(kwArgs))

通过反复试验,

[1] 在关键字和 **dict 之间,它们可以按任何顺序...

>>> import keywords3 as j

>>> j.func(b = 3, **{'a':2,'c':4,'d':5})
a = 2, b = 3
Positional args = ()
Keyword args = {'d': 5, 'c': 4}
>>> j.func( **{'a':2}, b = 3, **{'c':4})
a = 2, b = 3
Positional args = ()
Keyword args = {'c': 4}

[2] 在位置参数和*序列之间,它们可以按任何顺序...

>>> j.func(*(2, 3), 4, *(5, 6))
a = 2, b = 3
Positional args = (4, 5, 6)
Keyword args = {}
>>> j.func(2, *(3, 4), 5, *(6,7), **{'c':8})
a = 2, b = 3
Positional args = (4, 5, 6, 7)
Keyword args = {'c': 8}

[3] 一般来说,位置或*序列参数需要出现在关键字或 **dict 参数之前。

>>> j.func(*(3, 4), 5, *(6,7), d=15, **{'c':8}, e=16)
a = 3, b = 4
Positional args = (5, 6, 7)
Keyword args = {'e': 16, 'd': 15, 'c': 8}

>>> j.func(d=15, 5, *(6,7), **{'c':8}, e=16)
File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument

>>> j.func(**{'a':2}, 5, *(6,7), **{'c':8}, e=16)
File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument unpacking

>>> j.func(**{'a':2}, *(6,7), **{'c':8}, e=16)
File "<stdin>", line 1
SyntaxError: iterable argument unpacking follows keyword argument unpacking

[4] 一个异常(exception)是可迭代参数解包 *(6,7) 后面的关键字参数是可以的...

>>> j.func(f=5, *(6,7), **{'c':8}, e=16)
a = 6, b = 7
Positional args = ()
Keyword args = {'e': 16, 'f': 5, 'c': 8}

这些观察是否正确?请评论。

最佳答案

有一个规则与您的所有示例一致:位置参数位于命名参数之前。

在所有示例中,***解包运算符。因此,例如,当您编写时

f(1, *(2,3), 4)

语言得到

f(1,2,3,4)

它们都是位置参数,语言不知道其中的区别。对于 ** 运算符也是如此。

但是,当您违反唯一的规则时,例如

j.func(**{'a':2}, 5, *(6,7), **{'c':8}, e=16)

您会收到错误,因为在此示例中,**{'a':2} 相当于 a=2,它位于位置参数 5

关于Python 函数调用中参数传递的排序规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51915103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com