SyntaxError: 位置参数跟在关键字参数之后
SyntaxError: positional argument follows keyword argument
当我们在调用函数时在位置参数之前传递关键字参数时,会出现 Python“语法错误:位置参数跟随关键字参数”。
要解决该错误,请以正确的顺序传递位置参数,并在位置参数之后传递任何关键字参数。
下面是错误如何发生的示例。
def get_employee(first, last, salary): return {'first': first, 'last': last, 'salary': salary} # ⛔️ SyntaxError: positional argument follows keyword argument get_employee('Bobby', last='Hadz', 100)
将位置参数传递给函数看起来像'Bobby',
,而将关键字参数传递给函数看起来像last='Hadz'
。
- 将位置参数传递给函数时,仅传递值,例如
'Bobby'
. - 将关键字参数传递给函数时,会传递参数的名称和相应的值,例如
first = 'Bobby'
.
last
, 然后为salary
位置参数提供了一个值。如果您在位置参数之前指定关键字参数,Python 无法知道提供位置参数的值。
相反,关键字参数必须在位置参数之后。
def get_employee(first, last, salary): return {'first': first, 'last': last, 'salary': salary} # ✅ keyword arguments come after positional ones result = get_employee('Bobby', last='Hadz', salary=100) # 👇️ {'first': 'Bobby', 'last': 'Hadz', 'salary': 100} print(result)
我们first
作为位置参数和last
关键字salary
参数传递来解决这个问题。
只传递位置参数给函数
解决错误的一种方法是只将位置参数传递给函数。
def get_employee(first, last, salary): return {'first': first, 'last': last, 'salary': salary} # ✅ only passing positional arguments to the function result = get_employee('Bobby', 'Hadz', 100) print(result) # 👉️ {'first': 'Bobby', 'last': 'Hadz', 'salary': 100}
上面的示例仅使用位置参数。该函数根据位置参数的顺序知道我们为哪个参数传递了一个值。
只传递关键字参数给函数
或者,您只能将关键字参数传递给函数。
def get_employee(first, last, salary): return {'first': first, 'last': last, 'salary': salary} result = get_employee(salary=100, first='Alice', last='Smith') print(result) # 👉️ {'first': 'Bobby', 'last': 'Hadz', 'salary': 100}
salary=100
将位置参数和关键字参数传递给函数
您还可以在同一个函数调用中传递位置参数和关键字参数。请注意,关键字参数必须跟在位置参数之后。
def get_employee(first, last, salary): return {'first': first, 'last': last, 'salary': salary} result = get_employee('Bobby', salary=100, last='Hadz') print(result) # 👉️ {'first': 'Bobby', 'last': 'Hadz', 'salary': 100}
我们使用了位置参数 ( Bobby
) 和 2 个关键字参数 – (salary=100
和last='Hadz'
)。
确保您在函数调用中指定的任何位置参数都以正确的顺序传递(顺序必须与函数定义中的参数列表相对应)。
位置参数的顺序很重要
确保您不是盲目地将关键字参数移动到所有位置参数之后,因为位置参数的顺序很重要。
这是一个如何出错的示例。
def get_employee(first, last, salary): return {'first': first, 'last': last, 'salary': salary} # ⛔️ TypeError: get_employee() got multiple values for argument 'last' result = get_employee('Bobby', 100, last='Hadz')
示例中的关键字参数出现在任何位置参数之后,但我们仍然遇到错误。
first
我们得到错误的原因是我们使用位置参数为和参数传递一个值last
,然后last
使用关键字参数为参数传递一个值。解决示例中错误的最简单方法是仅将位置参数(以正确的顺序)传递给函数。
def get_employee(first, last, salary): return {'first': first, 'last': last, 'salary': salary} # ✅ only passing positional arguments (in the correct order) result = get_employee('Bobby', 'Hadz', 100) # 👇️ {'first': 'Bobby', 'last': 'Hadz', 'salary': 100} print(result)
Python 函数参数的顺序
函数的参数必须按以下顺序定义:
- 位置参数(必需,非默认)。
- 默认参数或关键字参数。
*args
– 接收过多的位置参数。**kwargs
– 接收多余的关键字参数。
在函数定义中使用*args
and**kwrags
You might also see the *args
and **kwargs
syntax being used to receive
excess positional or keyword arguments in a function.
def get_employee(first, salary, last='Doe', *args, **kwargs): print(args) # 👉️ ('developer', ) print(kwargs) # 👉️ {'country': 'Belgium'} return {'first': first, 'last': last, 'salary': salary} emp_1 = get_employee( 'Bobby', 100, 'Hadz', 'developer', country='Belgium' ) # 👇️ {'first': 'Bobby', 'last': 'Hadz', 'salary': 100} print(emp_1)
The form *identifier
is initialized to a tuple that receives any excess
positional arguments.
The form **identifier
is initialized to an ordered mapping that receives any
excess keyword arguments.
An excess positional argument with the value of developer
was supplied to the
function, so it got added to the args
tuple.
Similarly, the function doesn’t define a country
argument, so it got added to
the **kwargs
dictionary.
We passed the value developer
as a positional argument and the
country='Belgium'
value as a keyword argument.
emp_1 = get_employee( 'Bobby', 100, 'Hadz', 'developer', country='Belgium' )
Note that the keyword argument comes after all positional ones.
You can also only use **kwargs
or *args
, depending on your use case.
# Only taking excess keyword arguments
Here is an example function that only takes excess keyword arguments.
def get_employee(first, salary, last='Doe', **kwargs): # 👇️ {'country': 'Belgium', 'city': 'Example'} print(kwargs) return {'first': first, 'last': last, 'salary': salary} emp_1 = get_employee( 'Bobby', 100, country='Belgium', city='Example' ) # 👇️ {'first': 'Bobby', 'last': 'Doe', 'salary': 100} print(emp_1)
The function doesn’t define the country
and city
arguments, so they got
added to the kwargs
dictionary.
# Define default parameters after positional ones
The same is the case when a function definition has default parameters – it has
to define its default parameters after the positional ones.
# 👇️ default parameter `last='Doe'` def get_employee(first, salary, last='Doe'): return {'first': first, 'last': last, 'salary': salary} # 👇️ not passing value for default parameter emp_1 = get_employee('Bobby', 100) print(emp_1) # {'first': 'Bobby', 'last': 'Doe', 'salary': 100} # 👇️ passing value for default parameter emp_2 = get_employee('Alice', 100, 'Smith') print(emp_2) # {'first': 'Alice', 'last': 'Smith', 'salary': 100}
Default parameter values have the form parameter = expression
.
位置参数不能跟在带默认值的参数后面,否则 Python 无法知道我们传递的参数是默认参数还是位置参数。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: