编写Python库:结构、命名和导入最佳实践

5

假设我需要为我的公司编写几个小型到中型的库。

在Pythonic的方式中,使用Java方法并使用通用的高级包(咳嗽,模块)前缀所有库是否有意义,以实现以下结构:

mycompany.mylibrary1.moduleA
mycompany.mylibrary1.moduleB.moduleD
mycompany.mylibrary2.moduleC

或者直接选择以下选项是否更好:
mylibrary1.moduleA
mylibrary1.moduleB.moduleD
mylibrary2.moduleC

我注意到大多数情况下都采用第二种方法,但我希望确认(或不确认)这是正确的选择。
PEP 008中,我没有找到相关内容,只有以下内容:
Python库的命名规则比较混乱,所以我们永远无法完全保持一致[...] 之后我们只能得到模块和类的命名指示,以及不鼓励使用相对导入。
绝对导入是最好的方法,这使得组织库的方式非常重要(我不是在讨论避免相对导入的好与坏)。
我喜欢Java的方法,即为所有库命名空间,但我认为这不是Pythonic的...建议采取什么样的方式?
附注: 虽然在Stack Overflow上通常将“最佳实践”问题视为主观的,但是在Python中,PEP的存在使它们在我的看法中变得非常客观!尽管答案可能是...没有最佳的组织库的实践方法...

1
你是否打算让公司外的人使用这些库?如果是的话,将它们命名为 mylibrary1 更简单。如果它们仅供内部使用,mycompany.mylibary1 意味着你以后不会遇到其他人的 mylibrary1 带来的麻烦。 - Thomas K
1个回答

5

Python的导入和命名存在认知问题。由于有许多不同类型的一阶对象(原始类型、模块、类、函数、冒充模块的类、冒充对象的模块等),人们倾向于使用点符号来表示实体已经从外部源“到达”。因此,

import foo.bar
e = foo.bar.make_entity()

被认为比...更清晰

from foo.bar import make_entity
e = make_entity()

然而,这意味着您经常需要键入所需访问的完整路径。"com.example.some.lib.module.frobnicate()会很快变得烦人。因此,一个有礼貌的库会提供一个相对较短的名称来访问它。


感谢@Bittrance。这不是正式的最佳实践,但保持整个命名空间尽可能短是一个很好的理由。 - Stefano
你说得完全正确。我应该更清楚地表明我所描述的是我观察到的情况,而不是试图规范化。 - Bittrance

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