Python3 函数中类型注解(Function Annotations)

本文澄清了关于Python类型注解的常见误解,解释了注解如何用于指定参数和返回值类型,以及它们如何不影响代码执行。同时,通过实例展示了默认参数的使用。
部署运行你感兴趣的模型镜像

问题描述:

def read_text(path: Path, encoding=None) -> str:
    """
    Not Path.read_text for compatibility with Python 3.4.
    """
    with path.open(encoding=encoding) as f:
        return f.read()

看到这个代码时,一瞬间懵逼,这是Python3最新的函数类型注解特性,但是在网上找了一些中文资料看了之后发现一篇知乎文章(https://zhuanlan.zhihu.com/p/37239021)有个地方写错了,写道 “但同样,这些仅仅是“注解”,不会对代码产生任何影响。”,搜Python类型注解还挺排名挺高,把我害惨了,幸好我找到了官方文档【1】,建议看官方文档,故写篇博客记录一下,以防别人再犯这种低级错误。

解决方案:

其实很好理解,用 : 类型的形式指定函数的参数类型,用 -> 类型 的形式指定函数的返回值类型。Python 解释器并不会因为这些注解而提供额外的校验,没有任何的类型检查工作。也就是说,这些类型注解加不加,对你的代码来说没有任何影响。但是出现以下这种代码时:

   def load_model(self,
                   load_name: str,
                   load_epoch: int,
                   frozen_layer_count: int = 0,
                   allowed_characters_for_loaded_model: List[chr] = english_frequent_characters,
                   use_kenlm: bool = False,
                   reinitialize_trainable_loaded_layers: bool = False,
                   language_model_name_extension: str = ""):

在参数注解后还有=号,表示这个如果没有参数传入时候就会默认后面等号的值(相当于默认参数!!)。

实验证明:

定义一个函数注解的函数,其中有些参数只注解类型不带默认参数。

def foobar(a: int , b: str = 'softmax', c: float = 3.2) -> tuple:
    return a, b, c

执行如下代码:

a, b, c = foobar(a=1) 
print(a, b, c)

输出:

1 softmax 3.2

所以说如果默认参数不传参数进去的话,它会自动选择默认值。

reference:

【1】https://www.python.org/dev/peps/pep-3107/

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

Python 中,**函数注解(Function Annotations)** 是一种为函数参数和返回值添加元信息的语法特性。它允许你在函数定义中为参数和返回值添加任意类型的“注解”,这些注解不会影响程序的运行逻辑,主要用于**类型提示(Type Hints)**、**文档说明**或**框架处理**等用途。 --- ### 1. 基本语法 ```python def func(arg1: type1, arg2: type2) -> return_type: pass ``` - `arg1: type1` 表示参数 `arg1` 的注解是 `type1` - `-> return_type` 表示函数的返回值注解是 `return_type` --- ### 2. 示例 ```python def greet(name: str, age: int) -> str: return f"Hello {name}, you are {age} years old." ``` 在这个例子中: - `name: str` 表示建议传入字符串类型 - `age: int` 表示建议传入整数类型 - `-> str` 表示建议返回字符串类型 --- ### 3. 注解的作用 - **类型提示**:配合类型检查工具(如 `mypy`)进行静态类型检查。 - **文档增强**:帮助阅读代码,提高可维护性。 - **框架使用**:一些框架(如 FastAPI、Pydantic)利用注解实现自动验证、序列化等功能。 - **不影响运行**:Python 是动态语言,注解不会强制类型检查。 --- ### 4. 注解的存储方式 函数注解会以字典形式存储在函数的 `__annotations__` 属性中: ```python def greet(name: str, age: int) -> str: return f"Hello {name}, you are {age} years old." print(greet.__annotations__) ``` 输出: ``` {&#39;name&#39;: <class &#39;str&#39;>, &#39;age&#39;: <class &#39;int&#39;>, &#39;return&#39;: <class &#39;str&#39;>} ``` --- ### 5. 可以注解任意内容 注解不一定要是类型,也可以是字符串、表达式、甚至是任意对象: ```python def log(msg: "日志信息", level: 10) -> None: print(f"[{level}] {msg}") ``` --- ### 总结 | 特性 | 说明 | |------|------| | ✅ 语法支持 | Python 3.0 引入,3.5 后广泛用于类型提示 | | ❌ 不影响运行 | 注解不会强制类型检查 | | 🧠 配合类型检查工具 | 如 `mypy`、`pyright` 等 | | 📚 提高可读性 | 有助于文档生成和 IDE 智能提示 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值