You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.10类型提示中,如何正确为参数设置None默认值?

关于Python类型提示与参数默认值的疑问解答

核心结论

Iterable[str] | None(等价于Optional[Iterable[str]])仅用于声明参数允许的类型范围,和参数的默认值没有绑定关系——它不会自动帮你把参数默认值设为None。想要让参数默认值为None,必须显式写出= None。

报错原因解析

你遇到的SyntaxError: non-default argument follows default argument是Python函数定义的硬性语法规则:

  • 函数参数列表中,带默认值的参数必须排在无默认值参数的后面。
  • 错误代码里,level已经设置了默认值0.01,后面的exc没有默认值,直接违反了这个规则,因此触发语法错误。

正确写法说明

如果希望exc参数既可以接受Iterable[str]类型的值,也可以接受None,并且调用函数时可以省略该参数(默认取None),必须同时完成两件事:

  1. 用类型提示声明允许的类型:Iterable[str] | None
  2. 显式设置参数默认值:= None

也就是你最后那段可以正常运行的代码:

import pandas as pd
from typing import Iterable

def winsorise_df(df: pd.DataFrame, level: float = 0.01, exc: Iterable[str] | None = None) -> pd.DataFrame:
    pass

补充细节

  • 不管是Python 3.10+的|联合类型语法,还是旧版本的Optional,本质都是静态类型注解,只用于类型检查工具(比如mypy),不影响代码的运行逻辑。
  • 如果只想允许参数传None,但要求调用时必须手动传值(不能省略),可以只写类型提示Iterable[str] | None,但此时该参数必须排在所有带默认值的参数前面,比如:
def winsorise_df(df: pd.DataFrame, exc: Iterable[str] | None, level: float = 0.01) -> pd.DataFrame:
    pass

这种写法合法,但调用时必须给exc传值(可以是None),不能省略。

内容的提问来源于stack exchange,提问作者stevew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:10:38