前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python基础-类型注解 Optional 和 Union

python基础-类型注解 Optional 和 Union

作者头像
上海-悠悠
发布2023-09-21 08:13:53
2.1K0
发布2023-09-21 08:13:53
举报
文章被收录于专栏:从零开始学自动化测试

在 python 函数和类中,参数声明时可以声明参数是必填类型,也可以给参数设置默认值。

函数中的参数

以下函数,参数 a 是必填项,b 给了默认值,是可选项。

  • a 参数声明为 int 类型
  • b 参数声明为 int 类型,并给了默认值 1
  • -> int 是声明函数返回值是 int 类型
代码语言:javascript
复制
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

代码语言:javascript
复制
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 的作用是可选类型,作用几乎和带默认值的参数等价。不同的是使用Optional会告诉你的IDE或者框架:这个参数除了给定的默认值外还可以是None,而且使用有些静态检查工具如mypy时,对 a: int =None这样类似的声明可能会提示报错,但使用 a :Optional[int] = None不会。

typing.Optional 可选类型 Optional[X]等价于 Union[X, None]

请注意,这与可选参数的概念不同,后者是默认参数,具有默认值的可选参数Optional 仅在其类型注释中不需要限定符,因为它是可选的。 例如:

代码语言:javascript
复制
def foo(arg: int = 0) -> None:
   ...

另一方面,如果 None 允许使用显示值,则Optional 无论参数是否可选,的适合使用,例如

代码语言:javascript
复制
def foo(arg: Optional[int] = None) -> None:
   ...

Optional[X] 等价于 Union[X, None],当 Optional 参数的默认值为 None 时

代码语言:javascript
复制
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的时候

代码语言:javascript
复制
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 联合类型

联合类型;Union[X, Y]意味着:要么是 X,要么就是 Y。定义一个联合类型,需要注意的有:

  • 参数必须是类型,而且必须至少有一个参数。
  • 能继承或者实例化一个联合类型。
  • Union[X, Y]不能写成 Union[X][Y]
  • 可以使用 Optional[X] 作为 Union[X, None] 的缩写

如果一个参数可以是2种类型,上面的函数b参数,可以是None, 也可以是int, 于是可以这样写

代码语言:javascript
复制
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

代码语言:javascript
复制
from typing import Uniondef fun1(a: Union[str, int]) -> Union[str, int]:
    """str or int"""
    return a

于是可以看到在编辑器中函数的传 str 和 int 不会提示语法问题,传其它的 None 或 list 就会有语法提示。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-20 12:03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数中的参数
  • Optional 可选类型
  • Union 联合类型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档