在 python 存储库名称和包名称中使用连字符/破折号

Posted

技术标签:

【中文标题】在 python 存储库名称和包名称中使用连字符/破折号【英文标题】:Using hyphen/dash in python repository name and package name 【发布时间】:2019-07-02 23:29:49 【问题描述】:

我正在尝试使我的 git 存储库 pip 可安装。为此,我正在重组 repo 以遵循正确的约定。通过查看其他存储库,我的理解是,我应该将所有源代码放在与存储库名称同名的包中。例如。如果我的存储库名为myrepo,那么源代码将全部放入一个也称为myrepo 的包中。

为了便于阅读,我的存储库中有一个连字符:例如my-repo。所以如果我想为它创建一个同名的包,它也会有一个连字符。 In this tutorial 它对 python 包名称说“不要使用连字符”。但是,我见过一些成熟的软件包,例如 scikit-learn,它们的名称中有连字符。我注意到的一件事是,在scikit-learn repo 中,包名称与 repo 名称不同,而是称为sklearn

我认为我上面的讨论归结为以下问题:

    打包repo时,repository名和包名有什么关系?名字不匹配时有什么要注意的吗? 可以在包名称中使用连字符吗?存储库名称呢? 如果scikit-learn的包名是sklearn,那我安装的时候怎么会用pip install scikit-learn而不是pip install sklearn呢?

【问题讨论】:

不使用连字符是python的风格规则,就是PEP 8 是的,似乎在scikit-learn 中他们使用sklearn 作为包名。我不明白为什么在 pypi 中它被称为 scikit-learn 虽然:pypi.org/project/scikit-learn 不知道为什么允许它,但在 pypi.org 上的名称中,连字符并不重要 【参考方案1】:

为了回答您的第 1 点,让我将 my answer 改写为另一个问题。

误解的最大来源是“包装”这个词严重超载。游戏中有 4 个不同的名称——存储库名称、用于开发的目录名称(包含 setup.py 的目录名称、包含 __init__.py 和其他可导入模块的目录名称、名称在 PyPI 的分布。这 4 个通常相同或相似,但这不是必需的。

存储库和开发目录的名称可以是任何名称,它们的名称不起任何作用。当然,正确命名它们很方便,但这只是方便。

包含 Python 文件的目录的名称是要导入的包的名称。一旦包被命名为导入,名称通常会卡住并且无法更改。

发行版的名称给出了 PyPI 的一个页面和发行版文件的名称(源发行版、鸡蛋、***)。这是在setup(name='distribution') 电话中输入的名称。

让我展示详细的真实示例。我一直在维护一个名为CheetahTemplate 的模板库。我在名为cheetah3/ 的开发目录中开发它。 PyPI 的分布称为Cheetah3;这是我输入setup(name='Cheetah3') 的名称。***模块是Cheetah,因此一个是import Cheetah.Templatefrom Cheetah import Template;这意味着我有一个目录cheetah3/Cheetah/

2 的答案是:您可以在存储库名称和 PyPI 分发名称中使用破折号,但不能在包(带有 __init__.py 文件的目录)名称和模块(.py 文件)名称中使用破折号,因为您不能用 Python @987654339 编写@,那就是减法和SyntaxError

第 3 点:站点和存储库名称是 scikit-learn,以及 distribution name,但可导入的包(带有 __init__.py 的***目录)是 sklearn。

PEP 8 与该问题无关,因为它不讨论分发,只讨论可导入的包和模块。

【讨论】:

谢谢,这非常有帮助!

以上是关于在 python 存储库名称和包名称中使用连字符/破折号的主要内容,如果未能解决你的问题,请参考以下文章

模块和包

python -- 模块和包

python如何处理具有相同名称的模块和包?

获取android中所有已安装应用的名称、图标和包名

用python.检查“影片名称”字段为空值的+数据,给该字段填充数+据"unnamed"?

04 Python变量的声明与使用