SyntaxError: 非默认参数跟随默认参数
SyntaxError: non-default argument follows default argument
Python“SyntaxError: non-default argument follows default argument”发生在你定义一个函数时,它的位置参数跟在默认参数之后。
要解决该错误,请确保在函数的位置参数之后指定所有默认参数。
下面是错误如何发生的示例。
# ⛔️ 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))
我们None
为last
默认参数传递了一个值,因此使用默认值。
Python 函数参数的顺序
函数的参数必须按以下顺序定义:
- 位置参数(必需,非默认)。
- 默认参数或关键字参数。
*args
– 接收过多的位置参数。**kwargs
– 接收多余的关键字参数。
使用*args
and**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)
我们将country
和city
关键字参数传递给函数,它们都被添加到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) # 👉️ {}
函数体在每次调用时都会运行,所以问题不复存在。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: