在 python 函数和类中,参数声明时可以声明参数是必填类型,也可以给参数设置默认值。
以下函数,参数 a 是必填项,b 给了默认值,是可选项。
def fuc1(a: int, b: int = 1) -> int:
print('a+b的值为:', a+b) return a+bif __name__ == '__main__':
fuc1(2)
如果我们想给b参数设置默认值为 None, 如果用户传了 b 参数,b 必须是 int 类型,于是可以设置 b: int = None
def fuc1(a: int, b: int = None) -> int:
if b:
print('a+b的值为:', a+b) return a + b else:
print('a的值为:', a) return aif __name__ == '__main__':
fuc1(2)
以上代码在 pycharm 编辑器上执行是没有问题的,但是有些编辑器并不能识别b: int = None
这种语法。于是就有了 Optional 类。
Optional 的作用是可选类型,作用几乎和带默认值的参数等价。不同的是使用Optional会告诉你的IDE或者框架:这个参数除了给定的默认值外还可以是None,而且使用有些静态检查工具如mypy时,对 a: int =None
这样类似的声明可能会提示报错,但使用 a :Optional[int] = None
不会。
typing.Optional
可选类型
Optional[X]
等价于 Union[X, None]
请注意,这与可选参数的概念不同,后者是默认参数,具有默认值的可选参数Optional 仅在其类型注释中不需要限定符,因为它是可选的。 例如:
def foo(arg: int = 0) -> None:
...
另一方面,如果 None 允许使用显示值,则Optional 无论参数是否可选,的适合使用,例如
def foo(arg: Optional[int] = None) -> None:
...
Optional[X]
等价于 Union[X, None]
,当 Optional 参数的默认值为 None 时
from typing import Optionaldef func(a: int, b: Optional[int] = None) -> None:
"""Optional[int]=None"""
if b:
print("a+b的值:", a+b) else:
print("b is None")if __name__ == '__main__':
func(2)
运行结果:b is None
当Optional参数的默认值不为None,为1的时候
from typing import Optionaldef func(a: int, b: Optional[int] = 1) -> None:
"""Optional[int]=None"""
if b:
print("a+b的值:", a+b) else:
print("b is None")if __name__ == '__main__':
func(a=1, b=None)
此时传b=None,编辑器也不会提示有问题,这说明函数中b是一个可选参数,并且提示你它的默认值可以为None。
联合类型;Union[X, Y]
意味着:要么是 X,要么就是 Y。定义一个联合类型,需要注意的有:
Union[X, Y]
不能写成 Union[X][Y]
。Optional[X]
作为 Union[X, None]
的缩写如果一个参数可以是2种类型,上面的函数b参数,可以是None, 也可以是int, 于是可以这样写
from typing import Optional, Uniondef func(a: int, b: Union[None, int] = 1) -> None:
"""Optional[int]=None"""
if b:
print("a+b的值:", a+b) else:
print("b is None")if __name__ == '__main__':
func(a=1, b=None)
再举个例子,函数的参数a可以是str 和 int 两种类型,返回值也可以是 str 和 int
from typing import Uniondef fun1(a: Union[str, int]) -> Union[str, int]:
"""str or int"""
return a
于是可以看到在编辑器中函数的传 str 和 int 不会提示语法问题,传其它的 None 或 list 就会有语法提示。