如何在不重复顶层名称的情况下构造python包

发布于 2021-01-29 17:05:41

我是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()

要么

import bagoftricks

然后

>>> bagoftricks.bagoftricks.geofind()

而不是想要的…

from bagoftricks import geofind()

要么

import bagoftricks

>>> bagoftricks.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

不使用多余的顶级名称导入的自然导入(如标准包使用)的秘密是什么?

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    然后,您可以直接在此模块中或src目录中获取代码。您甚至可以拥有以下结构:

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

    但是我不建议这样做,主要是因为您以后可能需要重新组织事情,并且如果您已经有了一个“适当的”程序包,它会更容易。而且大多数人,工具和文档都假定您有一个软件包,因此更容易。

    因此最小值将是:

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

    随着__init__.py包含的功能要导入。然后,您可以使用以下功能:

    from bagoftricks import levenshtein, anotherfunction
    

    一旦__init__.py变得太大,您想将其拆分为几个模块,给您这样的东西:

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

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

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

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看