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

Ste*_*ano 5 python naming-conventions

假设我必须为我的公司写几个中小型库.

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

mycompany.mylibrary1.moduleA
mycompany.mylibrary1.moduleB.moduleD
mycompany.mylibrary2.moduleC
Run Code Online (Sandbox Code Playgroud)

或者更好的是简单地去:

mylibrary1.moduleA
mylibrary1.moduleB.moduleD
mylibrary2.moduleC
Run Code Online (Sandbox Code Playgroud)

我看到大部分时间都使用了第二种方法,但我正在寻找确认(或不是),这是要走的路.

PEP 008中,我在这方面找不到任何东西,旁边:

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

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

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

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

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

Bit*_*nce 5

python导入和名称存在认知问题.由于存在许多不同类型的一阶对象(基元,模块,类,函数,假装为模块的类,假装为对象的模块等等),人们倾向于使用点符号来表示实体具有"来自外部来源.从而

import foo.bar
e = foo.bar.make_entity()
Run Code Online (Sandbox Code Playgroud)

感觉比清楚得多

from foo.bar import make_entity
e = make_entity()
Run Code Online (Sandbox Code Playgroud)

但是,这意味着您将经常需要输入您需要访问的任何内容的完整路径."com.example.some.lib.module.frobnicate()很快就会很烦人.因此,礼貌的图书馆为其访问提供了一个相当短的名称.