SyntaxError:位置参数跟在关键字参数之后

SyntaxError: 位置参数跟在关键字参数之后

SyntaxError: positional argument follows keyword argument

当我们在调用函数时在位置参数之前传递关键字参数时,会出现 Python“语法错误:位置参数跟随关键字参数”。

要解决该错误,请以正确的顺序传递位置参数,并在位置参数之后传递任何关键字参数。

syntaxerror 位置参数跟随关键字参数

下面是错误如何发生的示例。

主程序
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}

仅传递给函数的关键字参数

我们只在函数调用中传递关键字参数。Python 根据关键字参数的名称知道我们为哪个参数传递了一个值,例如. 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 函数参数的顺序

函数的参数必须按以下顺序定义:

  1. 位置参数(必需,非默认)。
  2. 默认参数或关键字参数。
  3. *args– 接收过多的位置参数。
  4. **kwargs– 接收多余的关键字参数。

在函数定义中使用*argsand**kwrags

You might also see the *args and **kwargs syntax being used to receive
excess positional or keyword arguments in a function.

main.py
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.

main.py
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.

main.py
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.

main.py
# 👇️ 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.

When we declare a function with one or more default parameter values, the corresponding arguments can be omitted when the function is invoked.

位置参数不能跟在带默认值的参数后面,否则 Python 无法知道我们传递的参数是默认参数还是位置参数。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: