Python 中的静态类型检查工具

2023-12-21

我正在使用现有的大型 Python 代码库,并希望开始添加类型注释,以便获得一定程度的静态检查。我在想象类似的事情Erlang http://www.erlang.org/doc/reference_manual/typespec.html, 强语 http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.51.4406, or 类型化方案/球拍 http://docs.racket-lang.org/ts-guide/more.html#%28part._.Type_.Annotation_and_.Binding_.Forms%29.

我见过快速而肮脏的装饰器,它们根据函数参数和返回类型注释插入动态检查,但我正在寻找更强大并且在编译时执行检查的东西。

现在有哪些工具可以用于此类事情?我熟悉编译器和类型检查,如果一个不完整的工具有良好的基础,我绝对愿意对其进行改进。

(注意:我对静态类型的优缺点的讨论不感兴趣。)

EDIT: 一个例子:

def put(d, k, v):
   d[k] = v

我希望能够注释put函数具有类型put<K,V>(dict<K,V>, K, V) -> None.

UPDATE: 新的PEP 484 https://www.python.org/dev/peps/pep-0484/(2014 年 9 月)定义了 Python 3.5+ 中静态类型和类型注释的标准。有一个类型检查工具叫做mypy http://mypy-lang.org/与 PEP 484 兼容。


2016年11月11日编辑:只需使用mypy http://www.mypy-lang.org/。可以逐渐添加类型提示。在Python 3源代码中,它验证了标准PEP 484 https://www.python.org/dev/peps/pep-0484/键入提示。 Python 2 中仍然可以使用特殊注释来表达类型。圭多喜欢 https://mail.python.org/pipermail/python-ideas/2014-August/028618.html.

这篇文章最初是在 mypy 出现之前很久以前写的。我保留了下面帖子的原始内容,尽管它不太准确。


原帖:

您可能想查看本文中提到的一些项目有关 Python 静态分析的相关 StackOverflow 帖子 https://stackoverflow.com/questions/35470/are-there-any-static-analysis-tools-for-python.

总之:

  • pylint http://www.logilab.org/project/pylint
  • PyFlakes http://pypi.python.org/pypi/pyflakes
  • py检查器 http://pychecker.sourceforge.net/

由于Python使用鸭子打字 http://en.wikipedia.org/wiki/Duck_typing更广泛地说,在其他语言中可能被称为“类型错误”的东西最终可能会变成“对象”X不支持方法Y“在Python中。

2011年5月17日编辑:

我同意 delnan 的观点,静态类型对于 Python 来说是不可能的[显然是错误的]。但由于我们的怀疑似乎并没有阻止您,所以我只能向您提供有关该主题的更多信息。有请:

  • 的讨论Python 的类型推断 http://lambda-the-ultimate.org/node/1519。 (其他链接来自这里。)
  • Guido van van Rossum 关于添加可选静态类型的文章:part 1 http://www.artima.com/weblogs/viewpost.jsp?thread=85551 and part 2 http://www.artima.com/weblogs/viewpost.jsp?thread=86641.
  • RPython http://code.google.com/p/rpython/,Python 的一个子集,可能有机会进行足够的静态分析以进行某种形式的类型检查。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的静态类型检查工具 的相关文章

  • Django 中的 Rpy2 错误 - 未为“”类型的对象定义转换“py2rpy”

    我以前从未使用过 R 并且正在尝试使用 rpy2 从 python 调用 R 函数 它可以在独立的 python 终端上运行 但不能在 Django 中运行 但rpy2似乎无法将python字符串转换为r对象 我正在使用同事提供的自定义库
  • 如何让python优雅地失败?

    我只是想知道如何让 python 在所有可能的错误中以用户定义的方式失败 例如 我正在编写一个处理 大 项目列表的程序 并且某些项目可能不符合我定义的格式 如果 python 检测到错误 它目前只会输出一条丑陋的错误消息并停止整个过程 但是
  • 以矢量化方式在另一个 DataFrame 中查找包含值子集的行

    如何匹配此 DataFrame 中的值source car id lat lon 0 100 10 0 15 0 1 100 12 0 10 0 2 100 09 0 08 0 3 110 23 0 12 0 4 110 18 0 32 0
  • matplotlib 中的 R 风格数据轴缓冲区

    R 绘图自动设置 x 和 y 限制 以在数据和轴之间留出一些空间 我想知道 matplotlib 是否有办法自动执行相同的操作 如果没有 是否有一个好的公式或 经验法则 来说明 R 如何设置其轴限制 在 matplotlib 中 您可以通过
  • 组和平均 NumPy 矩阵

    假设我有一个任意的 numpy 矩阵 如下所示 arr 6 0 12 0 1 0 7 0 9 0 1 0 8 0 7 0 1 0 4 0 3 0 2 0 6 0 1 0 2 0 2 0 5 0 2 0 9 0 4 0 3 0 2 0 1 0
  • numpy:大量线段/点的快速规则间隔平均值

    我沿着一维线有许多 约 100 万个 不规则间隔的点 P 这些标记线段 这样 如果点是 0 x a x b x c x d 则线段从 0 gt x a x a gt x b x b gt x c x c gt x d 等 我还有每个段的 y
  • 如何使用 i18n 切换器将“LANGUAGE_CODE”保存到数据库,以便在 Django 中的不同浏览器中语言不会更改?

    有什么办法可以改变它的值LANGUAGE CODE单击按钮 发送请求 时 settings py 中的变量会动态变化吗 我希望用户设置自己的 默认语言 他们的帐户 现在 用户可以使用下拉列表选择他们的首选语言 并且网站会得到完美的翻译 并且
  • 张量流和线程

    下面是来自 Tensorflow 网站的简单 mnist 教程 即单层 softmax 我尝试通过多线程训练步骤对其进行扩展 from tensorflow examples tutorials mnist import input dat
  • scikit-learn 和tensorflow 有什么区别?可以一起使用它们吗?

    对于这个问题我无法得到满意的答案 据我了解 TensorFlow是一个数值计算库 经常用于深度学习应用 而Scikit learn是一个通用机器学习框架 但它们之间的确切区别是什么 TensorFlow 的目的和功能是什么 我可以一起使用它
  • 如何使用 PyMongo 在重复键错误后继续插入

    如果我需要在 MongoDB 中插入尚不存在的文档 db stock update one document set document upsert True 将完成这项工作 如果我错了 请随时纠正我 但是 如果我有一个文档列表并想将它们全
  • 返回上个月的日期时间对象

    如果 timedelta 在它的构造函数中有一个月份参数就好了 那么最简单的方法是什么 EDIT 正如下面指出的那样 我并没有认真考虑这一点 我真正想要的是上个月的任何一天 因为最终我只会获取年份和月份 因此 给定一个日期时间对象 返回的最
  • Pandas:将 pytz.FixedOffset 应用于系列

    我有一个带有timestamp列看起来像这样 0 2020 01 26 05 00 00 08 00 1 2020 01 26 06 00 00 08 00 Name timestamp dtype datetime64 ns pytz F
  • 在seaborn中对箱线图x轴进行排序

    我的数据框round data看起来像这样 error username task path 0 0 02 n49vq14uhvy93i5uw33tf7s1ei07vngozrzlsr6q6cnh8w 39 png 1 0 10 n49vq
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 线性同余生成器 - 如何选择种子和统计检验

    我需要做一个线性同余生成器 它将成功通过所选的统计测试 我的问题是 如何正确选择发电机的数字以及 我应该选择哪些统计检验 我想 均匀性的卡方频率测试 每代收集10 000个号码的方法 将 0 1 细分为10个相等的细分 柯尔莫哥洛夫 斯米尔
  • Django Rest Framework POST 更新(如果存在或创建)

    我是 DRF 的新手 我阅读了 API 文档 也许这是显而易见的 但我找不到一个方便的方法来做到这一点 我有一个Answer与 a 具有一对一关系的对象Question 在前端 我曾经使用 POST 方法来创建发送到的答案api answe
  • 如何更改matplotlib中双头注释的头大小?

    Below figure shows the plot of which arrow head is very small 我尝试了下面的代码 但它不起作用 它说 引发 AttributeError 未知属性 s k 属性错误 未知属性头宽
  • 如何从 nltk 下载器中删除数据/模型?

    我在 python3 NLTK 中安装了一些 NLTK 包 通过nltk download 尝试过它们 但不需要它们 现在想删除它们 我怎样才能删除例如包large grammars来自我的 NLTK 安装 我不想删除完整的 NLTK 安装
  • 在python中对列表列表执行行总和和列总和

    我想用python计算矩阵的行和和列和 但是 由于信息安全要求 我无法使用任何外部库 因此 为了创建矩阵 我使用了列表列表 如下所示 matrix 0 for x in range 5 for y in range 5 for pos in
  • Python 中的字符串slugification

    我正在寻找 slugify 字符串的最佳方法 蛞蝓 是什么 https stackoverflow com questions 427102 in django what is a slug 我当前的解决方案基于这个食谱 http code

随机推荐

  • 如何在 Firefox 中使用 php curl 发送推送消息

    我已经为 Chrome 实现了推送通知 当我需要向 GCM 发送推送消息时 我使用了以下 PHP 函数 function send push message subscription ids Set GCM endpoint url htt
  • C# .NET 支持 IDispatch 后期绑定吗?

    问题 我的问题是 C 本身支持后期绑定 IDispatch 吗 Pretend我正在尝试自动化 Office 同时与客户安装的任何版本兼容 在 NET 世界中 如果您在安装了 Office 2000 的情况下进行开发 则从现在到世界末日 每
  • 如何在 Gradle 构建中使用为 jar 文件提供的范围?

    我需要在我的应用程序中使用 Amazon Maps 和 Amazon Messaging 使用 gradle 我没有成功添加具有 提供 范围的 Amazon 依赖项正如他们需要的那样 https developer amazon com s
  • Swift 与泛型类型的条件一致性

    我正在尝试使用两种通用类型来使用 Swift 扩展 我试着举个例子 我们有一个盒子 可以容纳不同类型的物品 class Box
  • 求和间隔

    我必须对这样的间隔进行求和 1 6 2 4 The result is 1 6 so there are 6 numbers in the end 这是另一个例子 4 6 8 10 14 16 4 5 6 8 9 10 14 15 16 t
  • Docker 最佳实践:容器的单一进程

    码头工人最佳实践 https docs docker com engine articles dockerfile best practices 指南指出 您应该只在单个容器中运行单个进程 Nginx 和 PHP FPM 应该在单独的容器中
  • 使用 CString 进行 PInvoke

    我正在尝试使用 P Invoke 从 C 调用非托管 C DLL 中的函数 C DLL 使用CString 作为函数参数和返回值 例如 CString AFX EXT API GetUserName CString userID 不幸的是
  • 在初始化中省略重要的复制/移动构造函数是否合法?

    鉴于此应用程序 include
  • Python查找所有出现的连字符单词并替换该位置

    我必须用连字符替换所有出现的模式c c c c come or oh oh oh oh等与最后一个标记即come or oh在此示例中 其中 连字符之间的字符数是任意的 可以是一个或多个字符 要匹配的标记是连字符中的最后一个标记 因此com
  • 在 Dart/Flutter 中反序列化 json 数组

    如何反序列化这个json数组 i 737 n 1 得到变量 i e n 要反序列化的类 class PortasAbertas int i int n PortasAbertas this i this n PortasAbertas fr
  • 不建议在 ES6 中使用“use strict”?

    我还不熟悉 ECMAScript 6 我刚刚克隆了 React Starter Kit 存储库 它使用 ES6 作为应用程序代码 我很惊讶地发现 linter 是配置好的 https github com kriasoft react st
  • 在指令之间共享数据

    我有一些数据称为foo它所在的范围是三个孩子的父级 div div
  • 删除C中链表中每个奇数位置的节点

    我试图在 C 中创建一个函数来删除每个奇数位置的节点 例如1 2 3 4变成2 4 这是我尝试过的 但似乎不起作用 我正在谈论的是deletee功能 我修改了它 但列表似乎没有改变 include
  • Activity.setContentView、View.setContentView?

    我注意到 Activity 类有一个 setContentView 方法 可以在其中加载 xml 资源文件 我想对最终继承自 View 的类做同样的事情 这似乎是一个死胡同 因为 View 类不存在 setContentView 方法 这引
  • 正则表达式 \\s*,\\s* 的作用是什么?

    我想知道这行代码对 surl 字符串中包含的 url 有何作用 String stokens surl split s s 让我们假设这是 surl http myipaddress 8080 Map MapServer html 斯托克斯
  • 在android中检测拨出电话和呼叫挂断事件

    我有一个要求 其中我想检测与 Android 中的呼叫相关的两种事件 每当拨打电话时 我的应用程序都应该知道这一点以及被叫号码 当呼叫挂断时 由于成功 失败 我的应用程序应该了解这一点以及挂断的原因 这在 Android 中可能吗 您应该创
  • JQuery向div标签添加多个类

    我想使用 JQuery 获取下一行代码 div class something something else div I use document createElement div 创建div 但是我该如何添加something and
  • 如何让我的 .bat 文件运行 linux 命令到远程 linux

    以下是我当前的 bat 内容 我在window cmd上运行它 它将连接到远程 Linux 服务器并提示我密码 但是当我输入密码并以远程主机身份登录后 Linux 服务器将不会运行我的 ls 命令 请帮忙 echo off ssh emai
  • 自动rebase Git 子分支

    假设我有这样的 git 历史记录 A B C D
  • Python 中的静态类型检查工具

    我正在使用现有的大型 Python 代码库 并希望开始添加类型注释 以便获得一定程度的静态检查 我在想象类似的事情Erlang http www erlang org doc reference manual typespec html 强