如何构造python包而不重复导入的顶级名称

Mit*_*ops 22 python module package

我是python包管理的新手,肯定做错了.我被鼓励创建一个目录结构,如下所示:

bagoftricks
??? bagoftricks
?   ??? bagoftricks
?   ?   ??? __init__.py
?   ?   ??? bagoftricks.py
?   ??? __init__.py
??? README.md
??? setup.py
Run Code Online (Sandbox Code Playgroud)

bagoftricks.py包含两个函数,levenshtein()geofind().

我想称之为:

import bagoftricks

x = bagoftricks.levenshtein(arg1,arg2) 
Run Code Online (Sandbox Code Playgroud)

相反,我发现我必须这样做:

import bagoftricks

x = bagoftricks.bagoftricks.levenshtein(arg1,arg2) 
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法来组织我的包,而没有命名冗余?

UPDATE

所以,我按照下面的Avichal Badaya的说明,删除了一级嵌套.也就是说,我现在......

bagoftricks
??? bagoftricks
?   ??? __init__.py
?   ??? bagoftricks.py
??? README.md
??? setup.py
Run Code Online (Sandbox Code Playgroud)

但是,打电话给这个包,我还是......

from bagoftricks.bagoftricks import geofind()
Run Code Online (Sandbox Code Playgroud)

要么

import bagoftricks
Run Code Online (Sandbox Code Playgroud)

然后

>>> bagoftricks.bagoftricks.geofind()
Run Code Online (Sandbox Code Playgroud)

而不是期望....

from bagoftricks import geofind()
Run Code Online (Sandbox Code Playgroud)

要么

import bagoftricks

>>> bagoftricks.geofind()
Run Code Online (Sandbox Code Playgroud)

我无法删除额外的嵌套层.当我通过类比尝试删除一个级别的嵌套时,我的模块是平的,如:

bagoftricks
??? __init__.py
??? bagoftricks.py
??? README.md
??? setup.py
Run Code Online (Sandbox Code Playgroud)

我根本无法构建包...

$ python setup.py build
running build
running build_py
error: package directory 'bagoftricks' does not exist
Run Code Online (Sandbox Code Playgroud)

标准软件包使用自然导入的秘诀是什么,没有多余的顶级名称导入?

Len*_*bro 31

第一级"bagoftricks"很好.这就是你的"项目"的名称.在你有一个setup.py和其他文件告诉包装系统他们需要知道什么.

然后,您可以直接在此模块或src目录中获取代码.你甚至可以只使用这种结构:

bagoftricks
??? bagoftricks.py
??? README.md
??? setup.py
Run Code Online (Sandbox Code Playgroud)

但我不建议这样做,主要是因为您可能希望稍后重新组织,如果您已经拥有"正确"的包,则会更容易.大多数人,工具和文档都假设你有一个包,所以它更容易.

所以最低限度是:

bagoftricks
??? bagoftricks
?   ??? __init__.py
??? README.md
??? setup.py
Run Code Online (Sandbox Code Playgroud)

随着__init__.py包含的功能要导入.然后使用这样的函数:

from bagoftricks import levenshtein, anotherfunction
Run Code Online (Sandbox Code Playgroud)

一旦__init__.py变得太大,你想把它分成几个模块,给你这样的东西:

bagoftricks
??? bagoftricks
?   ??? __init__.py
?   ??? anothermodule.py
?   ??? levenshtein.py
??? README.md
??? setup.py
Run Code Online (Sandbox Code Playgroud)

__init__.py然后,您应该从各个模块导入函数:

from bagoftricks.levenshtein import levenshtein
from bagoftricks.anothermodule import anotherfunction
Run Code Online (Sandbox Code Playgroud)

然后你仍然可以像以前一样使用它们.