python与代码提示
由WebStorm引发的疑问
起因是这样,我想在 webstrom中使用cropto-js,安装导入后却没有任何和这个类相关的代码提示,但是在vscode 中确实会有代码提示,这个真的真的不能忍,
搜索了一圈发现要在WebStrom 中这这样设置
依次打开
settings
-> Languages && Frameworks
-> JavaScript
-> Library
然后往下找到cropto-js
的存根下载并安装就可以了,再写代码就有提示出现了,美滋滋。
JetBrains 把这个库的代码是称作存根,文件是存储在一个git项目中的
1 |
|
在一些开发项目中@types/xxx
会被做为开发依赖安装到库中
npm
仓库中直接有这个类型提示可以直接安装
1 |
|
深入了解之下发现这个东西叫DefinitelyTyped
也就是上面git
项目的仓库名,在 <<深入理解TypeScript>> 英文书名《TypeScript Deep Dive》中对此有深入介绍
连接在此
毫无疑问,DefinitelyTyped 是 TypeScript 最大的优势之一,社区已经记录了 90% 的顶级 JavaScript 库。
这意味着,你可以非常高效地使用这些库,而无须在单独的窗口打开相应文档以确保输入的正确性。
https://github.com/DefinitelyTyped/DefinitelyTyped 这个仓库有45.3k 的star(2023-09),其流行程度可见一斑。
我不是专业的前端工程师,平时写js不太多,主要是以python为主,但是不禁要问这么好的东西在Python语言中有没有?
Python 中的存根系统
你猜怎么着,真的有 这种东西。
首先找到了Hacker News
上的一个老哥,发出了和我一样的疑问。
Is there something like DefinitelyTyped for Python?
经过一番搜索发现了微软开源的python-type-stubs
仓库 里面有这样一段话:
有两种方法可以提供类型注释 — 通过内联类型注释和
.pyi
类型存根文件,这些文件可以与包捆绑在一起,也可以与其他一些源(如 typeshed 或 PyPI)分开安装。我们认为,包作者的最佳方法是使用显式内联类型注释来准确完整地描述其公共接口协定。这允许工具为包作者本身验证类型,并减少保持两个单独的 API 定义同步的维护负担。在无法进行内联类型注释的情况下(例如,对于编译的库),包应包含描述接口这些部分的存根文件。There are two ways type annotations can be provided — through inline type annotations and through
.pyi
type stub files, which may be bundled with the package or installed separately from some other source such as typeshed or PyPI. We believe that the best approach for package authors is to have explicit inline type annotations that accurately and completely describe their public interface contract. This allows tools to validate the types for the package authors themselves and reduces the maintenance burden of keeping two separate API definitions in sync. In cases where inline type annotations are not possible (e.g. for compiled libraries), packages should include stub files that describe those portions of the interface.
.pyi
文件类型中没有函数中没有具体实现,定义的是函数或者类的返回值类型。
1 |
|
Stubs for the following libraries now exist in typeshed or the libraries themselves and are no longer maintained here
以下库的存根现在存在于 typeshed 或库本身中,不再在此处维护
python-type-stubs
中提到的 typeshed
没有在仓库中给出链接,以这个关键词搜索找到了https://github.com/python/typeshed/
,这个项目应该就是python-type-stubs
仓库中提到的typeshed
。
如果你只是使用类型检查器(mypy,pyright,pytype,PyCharm等),而不是开发它,你根本不需要与typeshed存储库进行交互:typeshed的标准库部分的副本与类型检查器捆绑在一起。并且您正在使用的第三方软件包和模块的类型存根可以从 PyPI 安装。例如,如果使用
six
和requests
,则可以使用If you’re just using a type checker (mypy, pyright, pytype, PyCharm, …), as opposed to developing it, you don’t need to interact with the typeshed repo at all: a copy of standard library part of typeshed is bundled with type checkers. And type stubs for third party packages and modules you are using can be installed from PyPI. For example, if you are using
six
andrequests
, you can install the type stubs using
1
pip install types-six types-requests
原来这个类型检测能直接下载,马上去pypi 上搜索仓库中包含typed
和stubs
关键词的库
有的库是基于typeshed
库的提交自动生成的,有的是自己实现的。有的库还提到是基于pep561 提案写出来的,这个pep首次提案在2017年。
我在pypi中找到了常用库的typed
,可以留作参考,有需要的可以自己去pypi 中查找。 搜索的时候可以使用types
或者stubs
做为关键词
1 |
|
大名鼎鼎的numpy
现在把typed
集成到了自己的仓库中,直接下载最新的numpy
会有类型提示。
在PEP621
之前所有的python 官方是在一个requirements.txt
中记录安装信息 信息之有库及其版本号,无法区分生产环境和开发环境,如果只想在开发环境使用这些库,需要手维护两个版本的requirement.txt
文件
在PEP621
之后基于pyproject.yaml
可以使用poetry
或者flit
管理python包
1 |
|