SyntaxError:非默认参数遵循默认参数

SyntaxError: 非默认参数跟随默认参数

SyntaxError: non-default argument follows default argument

Python“SyntaxError: non-default argument follows default argument”发生在你定义一个函数时,它的位置参数跟在默认参数之后。

要解决该错误,请确保在函数的位置参数之后指定所有默认参数。

syntaxerror 非默认参数跟随默认参数

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

主程序
# ⛔️ SyntaxError: non-default argument follows default argument def get_employee(first, last='Doe', salary): return {'first': first, 'last': last, 'salary': salary}

位置salary参数跟随last导致错误的默认参数。

在位置参数之后指定默认参数

要解决该错误,请确保在位置参数之后指定函数的默认参数。

主程序
def get_employee(first, salary, last='Doe'): return {'first': first, 'last': last, 'salary': salary} emp_1 = get_employee('James', 100) print(emp_1) # {'first': 'James', 'last': 'Doe', 'salary': 100} emp_2 = get_employee('Alice', 100, 'Smith') print(emp_2) # {'first': 'Alice', 'last': 'Smith', 'salary': 100}

我们将last默认参数移到了salary解决错误的位置参数之后。

主程序
# ⛔️ incorrect syntax def get_employee(first, last='Doe', salary): # ✅ correct syntax (default parameter after positional) def get_employee(first, salary, last='Doe'):

默认参数值的形式为parameter = expression.

当我们声明一个带有一个或多个默认参数值的函数时,调用该函数时可以省略相应的参数。

主程序
def example(first, last='Doe'): return first + ' ' + last print(example('James')) # 👉️ James Doe print(example('James', 'Smith')) # 👉️ James Smith

如果未提供默认参数值,则使用默认值。

换句话说,位置参数是必需的,而默认参数是可选的。

位置参数不能跟在具有默认值的参数之后。

否则,Python 无法知道我们传递的参数是默认参数还是位置参数。

这是一个使用多个默认参数的示例。

主程序
def example(first, last='Doe', salary=100): return {'first': first, 'last': last, 'salary': salary} # 👇️ {'first': 'James', 'last': 'Doe', 'salary': 100} print(example('James')) # 👇️ {'first': 'James', 'last': 'Smith', 'salary': 100} print(example('James', 'Smith')) # 👇️ {'first': 'James', 'last': 'Smith', 'salary': 50} print(example('James', 'Smith', 50))

可以使用一个、两个或三个参数调用该函数。

如果要为参数使用默认值last但需要为 指定默认值,请在调用函数时salary使用一个值。None

主程序
def example(first, last='Doe', salary=100): return {'first': first, 'last': last, 'salary': salary} # 👇️ {'first': 'James', 'last': None, 'salary': 50} print(example('James', None, 50))

我们Nonelast默认参数传递了一个值,因此使用默认值。

Python 函数参数的顺序

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

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

使用*argsand**kwargs代替

您可以在表单中指定参数*identifier,也**identifier可以在函数定义中的默认参数之后指定参数。

主程序
def get_employee(first, salary, last='Doe', *args, **kwargs): print(args) # 👉️ ('developer', ) print(kwargs) # 👉️ {'country': 'Austria'} return {'first': first, 'last': last, 'salary': salary} emp_1 = get_employee('James', 100, 'Smith', 'developer', country='Austria') print(emp_1) # 👉️ {'first': 'James', 'last': 'Doe', 'salary': 100}

该表单*identifier被初始化为一个元组,该元组接收任何多余的位置参数。

该表单**identifier被初始化为一个有序的映射,该映射接收任何多余的关键字参数。

但是,请注意,如果省略默认参数的值,您可能会得到令人困惑的结果last

主程序
def get_employee(first, salary, last='Doe', *args, **kwargs): print(args) # 👉️ () print(kwargs) # 👉️ {'country': 'Austria'} return {'first': first, 'last': last, 'salary': salary} emp_1 = get_employee('James', 100, 'developer', country='Austria') print(emp_1) # 👉️ {'first': 'James', 'last': 'developer', 'salary': 100}

请注意,该last参数已设置为值developer

处理此问题的最佳方法是developer
在调用函数时为值使用关键字参数。

主程序
def get_employee(first, salary, last='Doe', *args, **kwargs): print(args) # 👉️ () print(kwargs) # 👉️ {'department': 'developer', 'country': 'Austria'} return {'first': first, 'last': last, 'salary': salary} emp_1 = get_employee('James', 100, department='developer', country='Austria') print(emp_1) # 👉️ {'first': 'James', 'last': 'Doe', 'salary': 100}
对于采用多个参数的函数,最好使用关键字参数,函数名称的顺序不明确。

关键字参数使用name='value'.

仅使用**kwargs函数定义中的参数。

**kwargs您也可以仅在函数定义中使用。

主程序
def get_employee(first, salary, last='Doe', **kwargs): print(kwargs) # 👉️ {'country': 'Austria'} return {'first': first, 'last': last, 'salary': salary} emp_1 = get_employee('James', 100, 'Smith', country='Austria') # 👇️ {'first': 'James', 'last': 'Doe', 'salary': 100} print(emp_1)

该表单**identifier被初始化为一个有序的映射,该映射接收任何多余的关键字参数。

country示例中的参数是多余的关键字参数,并被添加到字典中**kwargs

关键字参数使用name='value'.

使用 时,您可以根据需要传递尽可能多的关键字参数**kwargs

主程序
def get_employee(first, salary, last='Doe', **kwargs): # 👇️ {'country': 'Austria', 'city': 'Example'} print(kwargs) return {'first': first, 'last': last, 'salary': salary} emp_1 = get_employee('James', 100, country='Austria', city='Example') # 👇️ {'first': 'James', 'last': 'Doe', 'salary': 100} print(emp_1)

我们将countrycity关键字参数传递给函数,它们都被添加到kwargs字典中。

不要为非原始参数设置默认值

一个重要的注意事项是避免为非基本参数设置默认值,例如字典和列表。

这是一个如何出错的示例。

主程序
def get_address(address={}): return address addr1 = get_address() addr2 = get_address() addr1['country'] = 'Germany' print(addr1) # 👉️ {'country': 'Germany'} print(addr2) # 👉️ {'country': 'Germany'}

我们
调用了该get_address()函数 2 次
并将结果存储在变量中。

请注意,我们只country在其中一个词典上设置了键,但它们都得到了更新。

这是因为默认参数值只被评估一次——当函数被定义时。

每次调用函数时都不会评估它们。

当非原始默认参数值(例如字典或列表)发生变化时,它会为所有函数调用发生变化。

解决此问题的一种方法是将默认参数值设置为None
并在函数主体中有条件地更新它。

主程序
def get_address(address=None): if address is None: address = {} return address addr1 = get_address() addr2 = get_address() addr1['country'] = 'Germany' print(addr1) # 👉️ {'country': 'Germany'} print(addr2) # 👉️ {}

函数体在每次调用时都会运行,所以问题不复存在。

额外资源

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