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)
然后你仍然可以像以前一样使用它们.