函数调用和varagrs

zer*_*uno 3 python python-3.x

def func(a, b, c, d): print(a, b, c, d)

func(1, c=3, *(2,), **{'d':4})
func(1, c=3, 2, **{'d':4})
Run Code Online (Sandbox Code Playgroud)

为什么前者呼叫工作但后者不工作?我的意思是不应该第一次返回错误?不*只是解压缩一个iterable?

Jef*_*ado 5

位置参数必须始终出现在命名和解包参数之前.

在表达式中:

func(1, c=3, 2, **{'d':4})
Run Code Online (Sandbox Code Playgroud)

2是一个位置参数,c=3而是一个命名参数.用这种方式写的是无效的.您必须在所有位置参数后移动命名参数.

func(1, 2, c=3, **{'d':4})
Run Code Online (Sandbox Code Playgroud)

另一方面,表达式:

func(1, c=3, *(2,), **{'d':4})
Run Code Online (Sandbox Code Playgroud)

已验证. 1是这里唯一的位置参数. c=3是一个命名参数,*(2,)并且**{'d':4}已解压缩.只要位置参数首先出现,它就全部有效.