如何构造python包而不重复导入的顶级名称
我是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
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 *