”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 有多少 Python 包的版本控制正确?

有多少 Python 包的版本控制正确?

发布于2024-11-08
浏览:626

前几天,当我研究Python包中的漏洞数据库时,我意识到其中的一些包版本无法轻松解析并与其他版本字符串进行比较,因为它们不遵守Python 版本控制 - 旧的 PEP 440 或取代它的版本说明符规范。所以我开始想知道这种情况有多普遍。 Python 包索引上有多少包实际上具有有效版本?

显而易见的答案是:去检查。因此,我创建了一个新的虚拟环境,下载了请求,然后继续编写一个多处理脚本来查询 PyPI API,以获取每个包使用的每个版本字符串。即使在所有核心上运行,我也花了几个小时,但最终我从 545,018 个包中检索了超过 6,057,703 个版本字符串,这些字符串存储在一个整洁的 SQLite 数据库中。你可以在 Kaggle 上找到它。

接下来是解析。我发现两个库承诺验证版本字符串的合规性:

    pepver:“PEP-440版本解析、解释和操作”
  • parver:“parver 允许解析和操作 PEP 440 版本号”
请注意,公平地说,这两个仍然坚持 PEP-440,现已被替换,所以我会记住这一点,特别是在查看标记为不合规的字符串时。

又经过几个小时的密集多重处理,我用两个布尔列更新了我的数据库,指示这两个包是否成功解析了字符串(也在 Kaggle 上)。

结果

How many Python packages are versioned correctly?

快速总结我的发现:

  • 在 6,057,703 个版本字符串中,发现有 5,542 个 (0.09%) 有缺陷;

  • 在 545,018 个软件包中,1,285 个软件包 (0.24%) 至少有一个有缺陷的版本字符串。

所以总的来说,存储库的状态看起来相当健康!两个库发现错误的版本字符串有各种各样。有些只是以非标准方式使用后缀,但总体上遵循语义版本控制范例,而其他则只是提交哈希或单词和数字字符串。

两个库意见不一致的情况更有趣。这些是 pepver 不验证但 parver 验证的:

0.0.2.R 0.0.2.R3 0.0.2.R4 0.0.2.R5 0.0.2.R6 0.0.2.R7

0.0.2.R
0.0.2.R3
0.0.2.R4
0.0.2.R5
0.0.2.R6
0.0.2.R7


在这种情况下,我想说 pepver 是错误的。根据 PEP440 和当前版本控制规则,r 是发布后标签(标准化为 post)的可接受拼写,并且字母不区分大小写。因此,0.0.2.R3 实际上标准化为 0.0.2.post3 并且完全合法。

同时,以下是 pepver 承认但 parver 不承认的版本的随机样本:

0.0.1dev-20141025 1.5.0-dev-618 0.3.4.dev.20180830 1.15.0-dev-1552 1.4.0-dev-510 0.0.9.dev-20121012 0.2dev-20101203 0.3.4.dev.20180905 1.15.0-dev-1606 0.2.1dev-20110627 1.12.0-dev-1379 1.1.1-dev-275 1.3.1-dev-427

0.0.2.R
0.0.2.R3
0.0.2.R4
0.0.2.R5
0.0.2.R6
0.0.2.R7


它们的共同点是在 dev 后缀后使用其他数字(有时是日期),并带有一些分隔符。这确实也是错误的,因为在这种情况下规范不允许使用分隔符。所以帕弗似乎又是对的。

无论如何,这几乎满足了我最初的好奇心,并使我放心,在绝大多数情况下,解析和比较版本的标准方法就足够了。即使在非标准版本中,识别订单通常也相当容易,因为偏差很小。尽管如此,了解官方版本控制的所有怪癖并了解我们何时可以或不能依赖它们还是很有用的。

版本声明 本文转载于:https://dev.to/stur86/how-many-python-packages-are-versioned-correctly-5l8?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 数据工程终极指南。
    数据工程终极指南。
    数据工程是设计和构建用于大规模收集、存储和分析数据的系统的实践。这是一个广泛的领域,几乎在每个行业都有应用。本文旨在提供有关如何成为一名数据工程师的分步指南。 大多数数据工程师都拥有计算机科学或相关领域的学士学位背景,教授云计算、编码技能和数据库设计等基础知识。 要成为一名数据工程师,首先应该专注于...
    编程 发布于2024-11-08
  • 如何在 React 中使用广播通道 API
    如何在 React 中使用广播通道 API
    在当今的 Web 应用程序中,跨多个选项卡或窗口保持信息更新可以极大地增强用户体验。例如,如果用户在一个选项卡中注销,您希望该操作反映在所有其他选项卡中。 广播通道 API 通过允许同一来源的不同浏览上下文之间进行通信,使这一过程变得简单。本文将指导您如何在 React 应用程序中使用此 API。 ...
    编程 发布于2024-11-08
  • Pandas 中的链式分配有效吗?
    Pandas 中的链式分配有效吗?
    Pandas 中的链式赋值简介Pandas(流行的数据操作库)中的链式赋值是对数据框的值连续执行的操作。如果操作处理不当,可能会导致性能问题。链式分配警告Pandas 发出SettingWithCopy 警告以指示链式分配中潜在的低效率问题。这些警告提醒用户分配可能不会按预期更新原始数据框。副本和引...
    编程 发布于2024-11-08
  • JavaScript Promise:您需要了解的基础知识
    JavaScript Promise:您需要了解的基础知识
    介绍 JavaScript 是一种单线程编程语言,这意味着它一次只能运行一个任务。对于诸如获取数据或设置计时器之类的异步操作来说,这变得很棘手,这可能会阻止执行流程并减慢应用程序的速度。 为了在不冻结线程的情况下处理这些异步任务,我们遇到了Promise——一个简化异步编程的强大工...
    编程 发布于2024-11-08
  • 如何将 AngularJS ng-repeat 数据对齐到三个 Bootstrap 列中?
    如何将 AngularJS ng-repeat 数据对齐到三个 Bootstrap 列中?
    在三个引导列中对齐 AngularJS ng-repeat 数据AngularJS 提供 ng-repeat 来基于数据数组动态创建元素。当您处理大量元素时,将它们对齐到列中可以增强用户界面和可读性。基于控制器的转换首选方法是在控制器使用 JavaScript 的 chunk 函数,将数据分成大小均...
    编程 发布于2024-11-08
  • 如何在 Cypress 中验证上传和下载
    如何在 Cypress 中验证上传和下载
    介绍 处理文件上传和下载是端到端测试中的常见场景。在这篇文章中,我们将探讨如何使用 Cypress 处理文件上传和下载。尽管 Cypress 缺乏对这些操作的内置支持,但您可以通过利用一些库和 Cypress 强大的命令集来实现此功能。 读完本指南后,您将了解如何: 使用 Cypr...
    编程 发布于2024-11-08
  • 节流与去抖:何时使用哪种速率限制技术?
    节流与去抖:何时使用哪种速率限制技术?
    区分速率限制函数的节流和去抖在软件开发领域,管理函数调用的频率对于优化至关重要性能并防止不必要的资源消耗。节流和去抖是用于速率限制功能的两种流行技术,但理解它们的细微差别可能会令人困惑。为了简化它们的区别,请考虑以下类比:节流:想象一下你有一根不断喷水的软管。节流通过调节软管的开口或流量来限制水流的...
    编程 发布于2024-11-08
  • 如何使用免费词典API
    如何使用免费词典API
    封面照片由 Christopher Gower 在 Unsplash 上拍摄 您是否正在开发语言学习应用程序、写作助手或任何涉及单词并需要 API 来检索单词含义的项目?免费词典 API 提供了一种免费且易于访问的方式,将语言数据合并到您的作品中。本文档将向您展示如何开始。 在此 ...
    编程 发布于2024-11-08
  • 当条件涉及字符串字段的非零值时,为什么 MySQL 查询会返回所有行?
    当条件涉及字符串字段的非零值时,为什么 MySQL 查询会返回所有行?
    MySQL查询返回字段值非零的所有行:分析与解决方案当查询MySQL表时,条件如“ email=0”,其中电子邮件字段仅包含非零值,因此无法收到所有返回的行。此行为可能会损害数据完整性并带来潜在的安全风险。要了解发生这种情况的原因,请务必注意 MySQL 在比较过程中以不同方式处理数据类型。当将字符...
    编程 发布于2024-11-08
  • 在服务器上使用 Matplotlib 时如何解决“_tkinter.TclError:无显示名称且无 $DISPLAY 环境变量”错误?
    在服务器上使用 Matplotlib 时如何解决“_tkinter.TclError:无显示名称且无 $DISPLAY 环境变量”错误?
    解决“_tkinter.TclError:没有显示名称和没有 $DISPLAY 环境变量”错误在服务器上执行涉及 Matplotlib 的 Python 脚本时,您可能会遇到错误“_tkinter.TclError:没有显示名称,也没有 $DISPLAY 环境变量。”出现这个错误是因为Matplot...
    编程 发布于2024-11-08
  • Cypress Web 测试深入指南
    Cypress Web 测试深入指南
    在 Web 开发领域,测试是确保 Web 应用程序的可靠性、性能和用户体验的关键步骤。随着应用程序变得越来越复杂,对有效、高效且易于使用的测试工具的需求变得更加明显。这就是现代端到端测试框架 Cypress 的闪光点。在本文中,我们将探讨什么是 Cypress Web 测试、为什么它在其他测试工具...
    编程 发布于2024-11-08
  • 如何在 PHP 中实现立即调用函数表达式 (IIFE)?
    如何在 PHP 中实现立即调用函数表达式 (IIFE)?
    PHP 的立即函数调用在 PHP 中,立即调用函数表达式 (IIFE) 在 PHP 7 中具有部分等价性,因为您可以在函数执行完后立即调用该函数。定义。但是,PHP 5.x 不支持此功能。对于 PHP 7,示例如下:(function() { echo "yes, this works i...
    编程 发布于2024-11-08
  • 如何在 JavaScript 中将字符串编码和解码为 Base64?
    如何在 JavaScript 中将字符串编码和解码为 Base64?
    在 JavaScript 中将字符串编码和解码为 Base64处理二进制数据时,通常需要将其编码为更方便的格式字符串表示。 Base64 是一种流行的编码方案,它将二进制数据表示为一串可打印字符。这使得在 Web 应用程序和其他场景中传输和存储数据变得更加容易。在 JavaScript 中将字符串编...
    编程 发布于2024-11-08
  • 为什么加载“GeoIP.dat”时 `Class.getResource()` 返回 Null 以及如何修复它?
    为什么加载“GeoIP.dat”时 `Class.getResource()` 返回 Null 以及如何修复它?
    URL资源加载失败:Class.getResource返回Null尝试使用getResource()方法检索资源的URL时,一些用户遇到该方法返回 null 的问题。当尝试加载“GeoIP.dat”文件时,会特别出现此问题。这里更深入地探讨了潜在原因和加载资源的替代方法。可能的原因getResour...
    编程 发布于2024-11-08
  • 了解 PHP 元编程:动态代码操作
    了解 PHP 元编程:动态代码操作
    PHP 元编程 是指编写可以生成或操作其他代码的代码。换句话说,它使程序能够在运行时检查、修改甚至生成新代码,从而具有更大的灵活性。它还可能涉及反射、动态代码生成和内省等技术。 在 PHP 中,元编程最常使用: Reflection API:允许在运行时检查类、方法、属性等。 魔法方法:特殊方法,如...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3