python中的stub文件(.pyi)的用途
在阅读TVM源码时,发现了*.pyi文件,里面的函数没有具体的实现,都诸如如下的形式,感到很疑惑。
@overload
def getattr(__o: object, __name: str, __default: _T) -> Any | _T: ...
def globals() -> dict[str, Any]: ...
def hasattr(__obj: object, __name: str) -> bool: ...
def hash(__obj: object) -> int: ...
def help(request: object = ...) -> None: ...
def hex(__number: int | SupportsIndex) -> str: ...
def id(__obj: object) -> int: ...
def input(__prompt: object = ...) -> str: ...
查阅资料,简单的印象就是这是对类型进行检查的,但我并没有找到该函数的具体实现,难道只需要写个这就能对类型进行检查,这点还是带点疑惑的
转载:
https://www.likecs.com/show-308410242.html
参考资料:
https://blog.csdn.net/weixin_40908748/article/details/106252884
https://www.python.org/dev/peps/pep-0484/
https://www.jetbrains.com/help/pycharm/stubs.html
写这篇文章的原因是我在网上下载的项目中看到了.pyi文件,但是寻找了很多资料才对这些个概念(存根文件、类型检查)有了一个直观的印象。这篇随笔的目的是用最短的篇幅让你理解这些概念!
首先我介绍几个论断:
- PEP484
首先PEP是Python社区使用的规范化文档(就好像IETF用的rfc),PEP484这个文档是对type hint作规范化的文档!它规范化了type hint所需的语法用法...比如如果你关心stub存根文件是怎么做规范化的,你可以看参考资料2。
2.type checker
PEP484只是一个规范化的文档,没有给出具体的hint软件。事实上有一个内置模块叫typing,但它是让你用规范的语法写type hint的。不是一个类型检查器!!!
问:有哪些类型检查器可用?答:Pycharm内置有type checker,并且可用,明确支持stub file。mypy这个软件明确支持stub。其他的hinter,pyhinter等...我测试了一下,在vscode中效果不理想。
3.来看看,一个最简单的type hint,一个最简单的stub file长什么样
一个最简单的带annotation(type hint)的函数定义:
def greeting(name: str) -> str:
return "Hello" + name
一个最简单的stub file:
def greeting(name: str) -> str: ...
4.后缀为.pyi的stub存根文件的作用:
当没有存根文件,同时在函数定义的时候不加annotation的情况:

可见,由于python没有内置静态类型检查,只有运行时的动态检查。Pycharm给这个在运行时会出错的文件打了小对勾。
但是,当我们在同一个文件夹下写一个stub file之后呢?

有了stub file的指引,有了Pycharm内置的type checker做静态检查驱动。在代码没有运行的时候就检查出来了类型错误!!这在维护大型的项目的时候是非常有用的。
看了上面这几个论断,你是不是对相关的概念有了一个初步的理解?下面我们自己动手做一个实验,目的是在一个文件夹中写module并定义函数,在另一个文件夹中统一存放存根文件(因为方便管理呀,并且能够多次使用实现复用!)而且我们已经知道了,type checker这个活不是必须的,可以由mypy,Pycharm来干,那么我们想找到指导当然要寻求这些工具的指导。比如:Pycharm的stub说明。https://www.jetbrains.com/help/pycharm/stubs.html#create-stub-external,废话不多说,动手做一做。
第一步:生成代码文件和存根文件,其中存根文件放到一个统一的文件夹中统一存放。

第二步:
按照Pycharm文档中的指引,将存根文件的目录添加到PATH中,一定要注意文件名要对应上。(在IDE中可以方便的配置,当真正工程上应用的话可能就要手动添加PATH了,但要注意:hints是给人看的,类型检查也是给人警告的,不能脱离应用)
Reuse stubs
You can make your stubs accessible for your other PyCharm projects.
Click the Interpreter Settings.

In the .
In the to add the new path record:

Inspect your project: the directory with the stub files is now marked as a library root.

Any time you will use this project interpreter to work with other projects, this stub library will be accessible through the path you have just added.
第三步:
看一下结果,发现两个module文件都找到了对应的存根。其中在最左边出现了 * ,点击的话可以在实现以及存根中跳转。

python中的stub文件(.pyi)的用途的更多相关文章
- python中__init__.py文件的作用
问题 在执行models.py时,报ImportError:No module named transwarp.db的错误,但明明transwarp下就有db.py文件,路径也没有错误.真是想不通.后 ...
- python中逐行读取文件的最佳方式_Drupal_新浪博客
python中逐行读取文件的最佳方式_Drupal_新浪博客 python中逐行读取文件的最佳方式 (2010-08-18 15:59:28) 转载▼ 标签: python ...
- python中执行该文件,就调用 mian 方法
代码: test.py import student def main(): st = student.student(1001, 'tommy', 18) st.sing() st.dance() ...
- Python中__init__.py文件的作用详解
转自http://www.jb51.net/article/92863.htm Python中__init__.py文件的作用详解 http://www.jb51.net/article/86580. ...
- python中readline判断文件读取结束的方法
注:内容来自网络 本文实例讲述了python中readline判断文件读取结束的方法.分享给大家供大家参考.具体分析如下: 大家知道,python中按行读取文件可以使用readline函数,下面现介绍 ...
- 转载:【学习之家】Python中__init__.py文件的作用
Python中__init__.py文件的作用详解 Python中__init__.py文件的作用详解 来源:学习之家 作者:xuexi110 人气:357 发布时间:2016-09-29 摘要:__ ...
- python中处理.mat文件
python中处理.mat文件 背景 在实际使用python的时候,发现很多数据都是使用.mat的形式保存,所以,如何使用python读写.mat文件成为了许多python使用者必备的技能. -v7. ...
- python中操作csv文件
python中操作csv文件 读取csv improt csv f = csv.reader(open("文件路径","r")) for i in f: pri ...
- python中的pth文件作用
python中有一个.pth文件,该文件的用法是: 首先xxx.pth文件里面会书写一些路径,一行一个. 将xxx.pth文件放在特定位置,则可以让python在加载模块时,读取xxx.pth中指定的 ...
- 关于Python中读取写入文件并进行文件与用户交互的操作
一.提前知识点 在python中是同样和其他语言一样可以进行文件的读取写入操作,值得注意的是,Python中打开文件读取的方式有几种,分别是以下几种: f = open('username.txt') ...
随机推荐
- C# Web下的类库 项目中获取程序的运行路径
System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
- Clean WeChat X 微信垃圾清理工具,提升硬盘空间
Clean WeChat X是一款专业的微信清理工具,其拥有软件轻巧.干净.高效.免费等等特点,其能识别你电脑里的微信缓存.聊天记录.文件备份.小程序等等信息,方便大家选择性的清理文件. 多账号登录: ...
- Java - 高射炮打蚊子(第二弹)
题记部分 01 || 面试题 001 || 什么是JVM JVM(Java虚拟机)是Java程序运行的环境,它是一个抽象的计算机,包括指令集.寄存器集.堆栈.垃圾回收等.JVM屏蔽了与具体操作系统平台 ...
- Azure - [01] 订阅管理
题记部分 001 || 核心功能 (1)访问控制 Azure订阅通过基于角色的访问控制(RBAC)系统,允许管理员精细管理用户.组和应用程序对资源的访问权限.RBAC系统通过将权限分配给角色,再将 ...
- 【忍者算法】从快慢指针到倒数查找:优雅解决链表倒数问题|LeetCode第19题"删除链表的倒数第N个结点"
从快慢指针到倒数查找:优雅解决链表倒数问题 从生活场景说起 想象你在一个漫长的队伍中,想知道自己距离队尾还有多少人.一个巧妙的方法是:让你的朋友从你所在位置往后数N步,然后你和朋友一起向后走.当朋友走 ...
- 常见的各类LLM基座模型(GPT、DeepSeek、Qwen等)模型解析以及对比
From: https://www.big-yellow-j.top/posts/2025/02/15/LLM.html 各类LLM模型技术汇总 只去对比整体框架,对所采用的激活函数,归一化处理,位置 ...
- Go是怎么解决包依赖管理问题的?
我们先来了解一下 Go 构建模式的演化过程,弄清楚 Go 核心开发团队为什么要引入 Go module 构建模式. Go 构建模式时怎么演化的? Go 程序由 Go 包组合而成的,Go 程序的构建过程 ...
- 数据库自增 ID 用完了会怎么样?
前言 数据库中的自增 ID 用完了该怎么办? 这个问题可以分为有主键 & 无主键两种情况回答. 有主键 如果你的表有主键,并且把主键设置为自增. 在 MySQL 中,一般会把主键设置成 int ...
- pip和pip3如何更新
pip pip install --upgrade pip pip3 pip3 install --upgrade pip
- OpenHarmony 开源鸿蒙北向开发——hdc工具安装
hdc(OpenHarmony Device Connector)是为开发人员提供的用于设备连接调试的命令行工具,该工具需支持部署在 Windows/Linux/Mac 等系统上与 OpenHar ...