是否有命名单模块Python包的规则?

oro*_*ome 13 python python-module package pypi

我给Python包中单个模块的名称是否与包的名称相匹配?

例如,如果我有一个带有结构的单个模块的包

super-duper/
    super/
        __init.py___
        mycode.py
        ...
Run Code Online (Sandbox Code Playgroud)

我可以super-duper在PyPi上创建一个包,安装后会有两个site-packages名称不匹配的文件夹:

 super/
 super_duper-1.2.3.dist-info/
Run Code Online (Sandbox Code Playgroud)

这意味着要导入我使用的项目

import super
Run Code Online (Sandbox Code Playgroud)

而不是实际的包名(super_duper)

这似乎违反了常规做法(从我看到的每个其他包的文件夹判断site-packages)遵循该模式

 same_name/
 same_name-1.2.3.dist-info/
Run Code Online (Sandbox Code Playgroud)

用于PyPi包same-name.

我应该(总是)构建我的项目

super-duper/
    super_duper/
        __init.py___
        mycode.py
        ...
Run Code Online (Sandbox Code Playgroud)

确保包名称和模块导入名称"匹配":

import super_duper
Run Code Online (Sandbox Code Playgroud)

我应该遵循相关的最佳做法或规则吗?

小智 11

对您的问题的简短回答是:是的,通常一个好的做法是让模块的名称与单个模块包(应该是大多数已发布的包)的包名相匹配.

稍微长一点的答案是命名约定总是政治性的.在Python中定义语言标准的普遍接受的方法是称为"Python增强提议"(PEP)的过程.PEP由一组PEP编辑管理,并公开编入索引以供审阅和评论.

目前,我所知道的只有一个"活跃"(接受并实施)的PEP涵盖了模块命名约定,即PEP 8:

模块应具有简短的全小写名称.如果提高可读性,则可以在模块名称中使用下划线.Python包也应该有简短的全小写名称,但不鼓励使用下划线.

但是,在起草过程中还有另一个名为PEP 423的提案,它建议你在帖子中说明的内容:

每个项目仅分发一个包(或仅一个模块),并使用包(或模块)名称作为项目名称.

  • 它避免了项目名称与分布式软件包或模块名称之间可能出现的混淆.

  • 它使名称一致.

  • 它是明确的:当人们看到项目名称时,他会猜测包/模块名称,反之亦然.

  • 它还限制了包/模块名称之间的隐式冲突.通过使用单个名称,当您将项目名称注册到PyPI时,还可以执行基本的程序包/模块名称可用性验证.

重要的是要注意,此PEP仍处于"延迟"状态,这意味着它尚未被PEP编辑批准,并被另一个提议阻止(特别是在PEP 440中实现模块元数据语法的更新) .然而,自423的原始提案以来,没有起草任何竞争标准,而且大部分内容似乎都相当无争议,所以我希望将来可以接受它而不会有太多重大变化.


Mar*_*ers 5

我不知道需要您的项目名称与已安装的软件包或模块匹配的准则.有一个延迟草案PEP-423命名约定和包装相关的配方,但这实际上已被放弃(从未应用挂起的更新).

你说你看了,但你可能错过了一些现有的例子,其中包含的项目名称和包不匹配:

也就是说,我个人更喜欢它的PyPI项目名称和包含的包匹配; 它减少了混乱.最值得注意的例外是项目分支,其目的是维护旧的软件包名称以便于迁移.