什么是“纯Python”?

18
许多 Stack Overflow 上的问题都涉及“纯 Python”(从“类似问题”列表中随机选择的一些示例:1234567891011)。我在其他网站上也遇到了这个概念,比如 imageio 的软件包文档和诸如“纯 Python简介”之类的教程。这使我相信必须存在某种普遍接受的标准定义,来解释“纯 Python”是什么。但尽管我已经用尽了自己的搜索能力,但我还没有找到这个定义。是否有一个普遍被接受的“纯 Python”的定义,或者这只是一种难以捉摸的概念,对不同的人意味着不同的事情?

明确一下,我的问题是:这样的定义是否存在,是或否,如果存在,它的权威来源是什么?虽然我真的很感谢所有的评论和答案,但我不想要个人解释。


3
对我来说,“纯Python”意味着不需要安装外部包,但可以导入标准库。 - Chris_Rands
1
这是一个非常广泛的问题。但一般来说,纯Python指的是任何不需要pip install ...就可以使用的东西。 - cs95
1
通常指仅使用Python编写,而不使用在C中实现的模块(或其他语言用于除cPython之外的Python实现)。 - mata
1
@Dennis 我认为你不会在官方文档中找到这个。我只看过“implemented in pure python”,意思是仅使用Python而没有扩展模块。这里提到的另一种意思通常被称为“stdlib only”(“仅标准库”)。 - mata
1
我怀疑这里没有正式的定义。至少,它表明Python是代码库中唯一使用的语言。最多,它可能意味着实现依赖于除标准库之外的任何其他依赖项。似乎“纯Python”这个术语不如“Pythonic”广泛和强大,后者根植于Python之禅,得到了一些重要PEP的支持,并支持一些被接受的惯用做法。 - pylang
显示剩余4条评论
3个回答

21

在那个 imageio 包中,它意味着所有实现都是使用 Python 编写的,而不是(有时会这样做)使用部分 C 或其他语言编写。因此,它保证可以在任何 Python 可以运行的系统上工作。

在那个教程中,它指的是当你下载并安装 Python 后得到的 Python 语言和标准库,而不是任何外部模块。之后的章节添加了一些外部库,如 numpy 和 scipy,它们经常被使用,但不是标准库的一部分。

所以它们在这里已经具有不同的含义了。


4
我看到许多地方一直在使用第一个定义,以至于我会认为这是被广泛接受的含义。我认为那篇教程是个例外(作者误解了这个术语或者只是不知道这两个词经常一起使用),而不是一个同样有效的含义。 - Arthur Tacca
1
@ArthurTaca:嗯,还有更广泛的用法,如果你使用“纯 JavaScript”,那意味着不使用像 jQuery 或 React 这样的外部库或框架,即使它们本身只是 JavaScript 而不是 C 等。这取决于上下文。 - RemcoGerlich
在Python上下文中,“纯Python”通常用于暗示一个库不仅与cPython兼容,而且还可以与其他实现兼容(通常也会明确说明)-例如:[PyMySQL](https://github.com/PyMySQL/PyMySQL)。另外一个例子[paramiko](http://www.paramiko.org/)也使用了这个术语,但本身需要一个C扩展模块才能工作...“纯”只是一个没有定义的技术术语,因此对于这个问题没有正确或错误的答案。 - mata
第二个意思更常被称为“纯Python”,即只有标准库的CPython。 - gaborous

6
一个“纯Python”包是只包含Python代码的包,不包括C扩展或其他语言的代码。您只需要一个Python解释器和Python标准库来运行纯Python包,而且无论您的操作系统或平台如何都没有关系。
纯Python包可以导入或依赖于非纯Python包:
- 包X仅包含Python代码,是一个纯Python包。 - 包Y包含Python和C代码,不是纯Python包。 - 包Z导入包Y,但包Z仍然是一个纯Python包。
一个好的经验法则是:如果您可以创建一个源分发(“sdist”)并且它不包括任何非Python代码,则它是一个纯Python包。
纯Python包不仅限于Python标准库;包可以从Python标准库之外导入模块,仍然被视为纯Python。
此外,一个独立模块是一个只导入Python标准库模块的单个.py文件。独立模块必须是纯Python模块。
请注意,在Python中,技术上指的是具有__init__.py文件的文件夹。您使用pip从PyPI下载和安装的内容是分发(例如“源分发”或“sdist”),尽管术语“包”也被用作“分发”的同义词,因为该术语可能会与“Linux distro”使用的单词混淆。
“纯Python”有官方定义吗?截至本文撰写时,没有,尽管Python打包用户指南在https://packaging.python.org/overview/中频繁使用此术语。

1
“纯Python包可以导入或依赖于非纯Python包” -> 我不同意:如果您的软件包的核心逻辑需要非纯Python包,则您的软件包本质上只是一个包装器,不能称为纯Python。在我看来,“纯Python”包仅使用纯Python包中的Python语句实现核心逻辑。 - gaborous

0

不幸的是,似乎没有标准化、正式的定义。

作为一个使用Python编程近20年的程序员,我对纯Python的定义是:一个Python包,仅使用纯Python或本地包实现核心逻辑。这是一个递归语句,因此在您的包依赖树的最远端,您最终得到的是仅需要本地Python库/函数的Python包。采用这种方法,实现工具的主要目标所需的整个代码逻辑链可以仅使用Python进行阅读和修改,而且除了CPython解释器之外,不需要任何其他编程语言或工具。

这一点不能过分强调:“纯Python”更多地被定义为一个目标——完全可读和可修改的Python语言——而不是一种状态。这与姊妹语言Julia试图做的非常相似,但通过将该过程泛化到解释器,Julia语言本身就可以实现。你可以说Julia是通过设计实现“纯”的,而CPython则不是(因为CPython解释器是用C++编译的),但你仍然可以编写“纯Python”包,就像你可以编写不需要在程序逻辑的任何时候使用其他语言编写的包,如“纯PHP”或“纯Ruby”包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接