【问题标题】:Why there are __version__ strings in some modules of Python standard library?为什么 Python 标准库的某些模块中有 __version__ 字符串?
【发布时间】:2017-10-19 18:27:42
【问题描述】:

偶然我注意到python标准库的csvre模块都有它们的.__version__属性:

>>> import re, csv
>>> re.__version__
'2.2.1'
>>> csv.__version__
'1.0'

这让我很惊讶,因为它们是标准库的一部分,所以我希望它们的版本由sys.version(和sys.version_info)定义。

我注意到 Python 2.7.13 和 3.6.1 的属性值是相同的,尽管模块发生了变化。

它们只是一种“代码化石”还是它们有某种意义,程序员应该注意它们的价值观?

【问题讨论】:

  • 我认为您将 Python 版本与库版本混合在一起。例如,如果您使用 Linux-3.16 操作系统,这并不意味着您必须在其上运行 Firefox 3 才能浏览网页。版本号不是全局的。
  • 我猜不是答案,但是:“根据具体情况,标准库模块也以独立形式发布,用于其他 Python 版本,可能包含模块版本号当包含在标准库中时,并且在单独打包时应该包含版本号。" (source)
  • 此外,标准库通常是具有特定版本号的包的集合。但是软件包的开发仍在继续。因此,您可以决定使用re 的“夜间构建”版本,它可能提供一些实验性功能,但尚未经过全面测试以将其包含在标准库中。通常标准库旨在选择或多或少可靠的高质量包。
  • @WillemVanOnsem 我想念这个比喻吗?如果我有 same 版本的模块(csv 的情况下为 1.0),我希望它的行为相同。文档表明 Python 2.7 和 Python 3.6 之间的两个模块都发生了很多变化。

标签: python python-2.7 python-3.x version standard-library


【解决方案1】:

我可以假设 C 上模块的源代码版本没有改变,只有 python 模块的源代码在不同版本的 python 本身之间发生了变化。在python 存储库中寻找源代码可以了解整个情况。

例如:

【讨论】:

  • 这基本上是对的。但是,re 的版本目前似乎不同步:re.__version__ 提供 2.2.1,但 re.sre_compile._sre.copyright 提供 2.2.2。
  • @ekhumoro sre是python模块re中导入的C库,有自己的版本,所以它们的版本可能不相等
  • 不,这些版本应该是相同的,这正是您在回答中给出的原因。我认为上次 C lib 版本被碰撞时有人忘记更新 python 模块。 csv 模块直接从其 C 库中获取其__version__,因此它不存在该潜在问题。
  • @ekhumorob,嗯,这很奇怪,因为csv 从 C 导入版本。为什么re 不这样做 - 最好问问 Guido。我以为srere其实是不同的包。
  • 这并不奇怪 - re 模块是一个 Python 包装器,围绕着其他几个模块,包括 src_parsesrc_compile_src C lib 模块已经很老了,并且是由第三方创建的,所以它没有定义 __version__(这是一个更新的 API)也就不足为奇了。我上面的第一条评论只是为了提供信息,因为问题中特别提到了re 模块。
猜你喜欢
  • 1970-01-01
  • 2014-03-07
  • 2011-08-30
  • 1970-01-01
  • 2020-02-23
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多