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

如何构造python包而不重复导入的顶级名称,python,module,package,Python,Module,Package,我是python软件包管理的新手,肯定做错了什么。我被鼓励创建一个目录结构,如下所示: bagoftricks ├── bagoftricks │   ├── bagoftricks │   │   ├── __init__.py │   │   └── bagoftricks.py │   └── __init__.py ├── README.md └── setup.py bagoftricks.py包含两个函数,levenshtein()和geofind() 我想称之为: import

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

bagoftricks
├── bagoftricks
│   ├── bagoftricks
│   │   ├── __init__.py
│   │   └── bagoftricks.py
│   └── __init__.py
├── README.md
└── setup.py
bagoftricks.py包含两个函数,
levenshtein()
geofind()

我想称之为:

import bagoftricks

x = bagoftricks.levenshtein(arg1,arg2) 
相反,我发现我必须这样做:

import bagoftricks

x = bagoftricks.bagoftricks.levenshtein(arg1,arg2) 
在没有命名冗余的情况下,有没有更好的方法来组织我的包

更新

因此,我按照下面的Avichal Badaya的指示,移除了一层嵌套。就是说,我现在有

bagoftricks
├── bagoftricks
│   ├── __init__.py
│   └── bagoftricks.py
├── README.md
└── setup.py
然而,要说这个包裹,我还有

from bagoftricks.bagoftricks import geofind()

然后

而不是期望的

from bagoftricks import geofind()

我无法移除额外的嵌套层。通过类比,当我尝试删除一个以上的嵌套级别时,我的模块是平面的,如下所示:

bagoftricks
├── __init__.py
├── bagoftricks.py
├── README.md
└── setup.py
我根本无法构建包

$ python setup.py build
running build
running build_py
error: package directory 'bagoftricks' does not exist

没有冗余的顶级名称导入,自然导入(如标准包)的秘诀是什么?

遵循以下结构:

bagoftricks 
    ── bagoftricks
    │ ├── __init__.py
    │ └── bagoftricks.py 
    ├── README.md
    └── setup.py
然后,您应该能够将其用作:

from bagoftricks.bagoftricks import levenshtein, geofind
但在更改文件夹结构后,请执行以下操作:-

pip uninstall <your package name mostly mentioned in setup.py>
安装程序可能还有一些其他参数。我希望它对你有用。

第一级“bagoftricks”很好。可以说,这只是你的“项目”的名称。在中,您有一个setup.py和其他文件,这些文件告诉打包系统他们需要知道什么

然后,您可以将代码直接放在这个模块中,或者放在src目录中。您甚至可以使用以下结构:

bagoftricks
├── bagoftricks.py
├── README.md
└── setup.py
但我不建议这样做,主要是因为您可能希望以后重新组织事情,而且如果您已经有了一个“适当”的包,这会更容易。此外,大多数人、工具和文档都假设您有一个软件包,所以这更简单

因此,最低要求是:

bagoftricks
├── bagoftricks
│   └── __init__.py
├── README.md
└── setup.py
使用包含要导入的函数的
\uuuu init\uuuuu.py
。然后使用以下函数:

from bagoftricks import levenshtein, anotherfunction
bagoftricks
├── bagoftricks
│   ├── __init__.py
│   ├── anothermodule.py
│   └── levenshtein.py
├── README.md
└── setup.py
一旦
\uuuuu init\uuuuuu.py
变得太大,您就需要将其分成几个模块,如下所示:

from bagoftricks import levenshtein, anotherfunction
bagoftricks
├── bagoftricks
│   ├── __init__.py
│   ├── anothermodule.py
│   └── levenshtein.py
├── README.md
└── setup.py
然后,您的
\uuuu init\uuuuu.py
应该从各个模块导入函数:

from bagoftricks.levenshtein import levenshtein
from bagoftricks.anothermodule import anotherfunction

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

使用你发布的更新结构

bagoftricks
├── bagoftricks
│   ├── __init__.py
│   └── bagoftricks.py
├── README.md
└── setup.py

into bagoftricks/__init__.py import all functions that you need

__init__.py
from bagoftricks import geofind, levenshtein
在不同的程序中,您可以执行以下操作

from bagoftricks import geofind
import bagoftricks; bagoftricks.geofind(); bagoftricks.bagoftriks.geofind()
请注意,您还可以导入通配符

from bagoftricks import *

是否有任何配置可以让我只需一次呼叫即可完成?只需从bagoftricks导入levenshtein,geofind而不是从bagoftricks调用子模块,
。bagoftricks导入levenshtein,geofind
?@Mittenchops put
。bagoftricks import levenshtein,geofind
在您的
bagoftricks/_init_uuuuuuuuuy.py中
谢谢,这很清楚,也很有帮助,特别是关于如何有效和正确种植它的提示。当时的问题肯定是我的init.py语句。我不太明白它在层次结构中的位置,以及应该把它放在哪里以缩短通话时间。工作完美。谢谢天哪,我已经写python多年了,这是我第一次听说init.py文件可以包含一些东西!我只是让它四处浮动以指示哪些目录是模块的一部分!尽管从模块导入*导入通配符(如
)被认为是非常糟糕的做法,因为它可能导致命名空间冲突。始终尝试通过命名您导入的所有内容来导入。是的,您是对的,但对于本例来说,这很好。还请注意,bagoftricks中的模块被导入到名称空间bagoftricks中;为什么这个例子没问题?如果您从bagoftricks导入geofind,然后从另一个模块导入一个也称为geofind的函数,则会发生冲突。我错过了什么?为什么这个示例与其他Python代码不同?用通配符导入是不好的做法,句号。
from bagoftricks import geofind
import bagoftricks; bagoftricks.geofind(); bagoftricks.bagoftriks.geofind()
from bagoftricks import *