Discuss / Python / 关于文中一处问题的现象和解释,有异议,欢迎分析和探讨 @廖雪峰

关于文中一处问题的现象和解释,有异议,欢迎分析和探讨 @廖雪峰

Topic source

roc风羿

#1 Created at ... [Delete] [Delete and Lock User]

引用本文中的下面内容:

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

def person(name, age, *args, city, job):
    print(name, age, args, city, job)

命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:

>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: person() takes 2 positional arguments but 4 were given

由于调用时缺少参数名cityjob,Python解释器把这4个参数均视为位置参数,但person()函数仅接受2个位置参数。

如果根据前文定义的函数:

def person(name, age, *args, city, job)

实验,则后文的报错及分析是错误的或者说不是针对该定义函数的,使用该函数正确的报错是如下文:

>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: person() missing 2 required keyword-only arguments: 'city' and 'job'

分析错误得出的结论是没有传入"city"和"job" 2个命名关键字参数,而文中

>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: person() takes 2 positional arguments but 4 were given

由于调用时缺少参数名cityjob,Python解释器把这4个参数均视为位置参数,但person()函数仅接受2个位置参数。

此处的报错和分析是针对小节 ‘命名关键字参数’ 中定义的函数:

def person(name, age, *, city, job)

而言的。


  • 1

Reply