编写python库:结构,命名和导入最佳实践

时间:2012-05-04 11:36:00

标签: python naming-conventions

假设我必须为我公司编写几个中小型库。

以pythonic方式使用Java方法并使用通用高级包(ahem,模块)为所有这些方法添加前缀(如实现以下结构)是否有意义:

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

或者只是选择更好:

mylibrary1.moduleA
mylibrary1.moduleB.moduleD
mylibrary2.moduleC

我发现大部分时间都使用了第二种方法,但我正在寻找确认(或不确定)的方法。

我在PEP 008中找不到这方面的任何内容,旁边是:

  

Python库的命名约定有点混乱,所以我们永远不会完全一致[...]

然后我们只获得模块和类命名指示,以及不鼓励 相对导入的事实

绝对导入的事实是决定你如何组织你的图书馆真正重要的事实(我不是在这里讨论是否避免相对进口是好还是坏)。

我确实喜欢用你的所有库命名空间的Java方法,但我觉得它不是pythonic ...建议的方法是什么?

PS。 虽然一般来说“最佳实践”问题在SO上被认为是主观的,但在Python中,PEP的存在使我们认为它们非常客观!虽然答案可能是......但是组织你的图书馆并不是最好的做法..

1 个答案:

答案 0 :(得分: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()很快就会很烦人。因此,一个礼貌的图书馆为其访问提供了一个相当短的名称。