尧图精选

python 编码中为什么要写类型注解?

🕒 发布时间:2026/9/13 21:38:31 📁 来源:尧图网络
1、背景我们先谈谈为什么在编码过程中强烈推荐使用类型注解 这对于刚开始学习的人来讲是特别容易上手的, 其间的道理在于把计算机底层原理全方位地进行封装, 以及动态语言所具备的特性促成使用时特别舒适。然而这种所谓的“舒适”得有相应代价, 我们或许听说过一句描述动态语言的话语,即动态在某时会让人觉得畅快。紧接着就始终处于这般动态的情况之下, 持续保持畅快。那为何会这样讲呢? 动态确实能够给予我们于编码之际更多的灵活性以及能力, 然而动态所带来的却是更多的不确定性以及混乱, 致使后来的维护者乃至作者自身都会生出极大的维护压力能够想象一个历经数年迭代的复杂系统, 要是大多都运用动态的方式去编写代码的模样, 正所谓能力越大责任越大, 需加以克制。在维护以及开发期间, 类型注解能够很好地协助我们, 将变量的类型厘清, 从而降低不确定性以及混乱程度, 进而能够从容地去使用变量。在这儿讲了这么多没用的话, 主要目的在于, 能够使得读者深切地认识到, 动态所导致的正向以及反向带来的那种“爽”。往后就要进入主题了。2、使用方式2.1、 内置的类型注解大家可能都接触过内置注解, 不过总觉得它特别麻烦, 致使后面很轻易地就放弃去写注解, 其中缘由是得到的并非正面反馈, 请看下面这个示例:字符串类型的a被赋予结果为aa的值, 整数类型的b被赋予结果为1的值, 参数和返回标注了类型, 使得接下来调用时能够进行提示, 定义了一个有特定要求的函数, 其要求这个函数的唯一参数a是字符串类型且返回应为字符串类型时其函数体为用a格式化后的Hello {a}, 执行输出语句打印了用括号括起来的world时出现了错误, 这里进行补充说明, 一些简单的标注看起来好像起不到成效, 然而要是换成有含义的名字又会如何呢, 定义了User这个名称, 它被赋予一个函数, 该函数的参数规范为User类型的u且没有返回值, 其函数体是用u格式化后的Hello {u}, 执行输出语句打印了用括号括起来的空字符串时出现了错误。方才简略地展示了, 内置的那种类型注解究竟是怎样予以运用的, 然而实际上这般简单情况下的类型注解, 根本没办法助力我们优质地给变量施行标注接下来要讲述的是一个模块。2.2、 模块的快速入门类型注解的主角是模块, 函数和变量类型注解在运行时并不会被强制执行, 不过这些注解能够被使用在, 例如类型检查器、IDE以及静态检查器等第三方工具上, 在我们编码的时候, 这些第三方工具会进行提示以及纠错。下面提供一些日常使用到的方法与用例给大家参考# 自定义类型注解User等于等于int, # 定义有多种类型注解的类型为.(, str, bytes), a_str等于a且等效于ba, # 通用类型, 接收通用的类型, 要尽量少地去使用def函数参数为(a:.Any)来打印输出a 模块是允许使用下标来辅助标记类型的, # 像列表这个变量而言, 下标便作为存储列表的属性, def函数参数为(:.List), 最后的可返回值为由相关类型限定为.List, # 字典类型的话, 下标里面第一个当成是key, 第二个为(:.Dict)。User, Age括号右箭头点字典冒号通过哈希符号, 元祖, 下标为元祖的属性定义左括号冒号点元组等于无右箭头点元组冒号通过哈希符号, 联合, 在一些场景下我们某些参数或返回值是不确定的, 至少给定一个参数类型定义左括号a逗号b冒号点联合右箭头点联合冒号通过哈希符号, 逗号与联合有点类似, 但默认多带一个None, 至少给定一个参数类型, 如冒号等价于联合。str, None定义一个函数, 它接受一个字符串类型的参数, 但其返回值类型是一个未明确指定的类型, 代码表示为空语句。当返回值有多个的时候, 如果需要返回字符串类型、整数类型、布尔类型, 其函数定义的形式是, 括号内为空, 返回值类型为一个未明确具体内容的元组类型。str, int, bool, float通过#类, 类自身同样是一种那类型class: 向上: 字符串等于“向上”向下: 字符串等于“向下”#明确有着需求一个对象的那些参数def : -: 通过#如此在一些枚举参数面临的场景之下, 我们也能够运用类当作我们枚举参数的那种归类def : -: 通过#要是上面所提及的枚举参数你觉着并并未特别好地达成, 那么依旧能够采用自定义类型注解的办法去达成 结构向上: “向上”向下: “向下”#在.9里对于枚举参数类型有着更好的支撑模式 类型。r, rb, w, wb以某种方式确定这一情况, 即定义一个函数, 它接收参数为一个字符串类型的文件路径, 还有一个处于特定模式类型的参数, 之后该函数返回一个也是字符串类型的结果 , 具体来说在使用时输入为(/some/path, r) , 这种情况下是正常的 , 而要是输入(/other/path, typo) , 就会提示该模式类型不合法 , 这里所说的类型 , 是在一些存在多态类的场景下 , 用于标注同一个类型的不同的形态 , 比如定义一个用户类User , 之后进行一些相关的类的定义 , 这里存在多个类 , 它们都与User相关 , 这相当于某种联合类型。User, , ,def (: .Type) - User: ()上述十几个用例场景大体而言能够覆盖多数日常编码情形, 要是存在一些别的需求, 那么可以参考官方的文档, 其上有着明确的说明。Docs: /zh-cn/3/lib…3、写在最后期望文章可以对众人对于类型注解的知晓以及运用产生助益, 尽早告别处于被那种复杂状态缠绕得心里忍不住想要发火却又理不清头绪的日子。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →