关于python:__ init__.py import还公开我使用的模块,不仅仅是我自己的类

__init__.py imports expose also modules I use, not only my own classes

本问题已经有最佳答案,请猛点这里访问。

我对python导入有些不了解。我读了几十篇文章,但找不到满意的答案。情况是这样的:

我正在写一个由几个模块组成的包。假设包名为pack1。在__init__.py文件中,为了公开我在模块中定义的类和函数,我写了:

1
2
3
    from .module1 import *
    from .module2 import *
    ...

现在,在模块1中:

1
2
3
4
5
6
7
8
9
10
    from math import sqrt  # a tool that I need

    class class1:
         <body>

    class class2:
         <body>
    ....
    class class100:
         <body>

我的问题是当我

1
    import pack1

在另一个项目中,我在pack1的名称空间中看到sqrt。为了避免这种情况并保持名称空间干净,是否必须分别导入__init__.py文件中的100个类中的每一个?我是否需要对__init__.py中的inspect模块进行一些黑客攻击,以便识别定义的类和未导入的类(我认为这非常难看)?或者,正如我怀疑的那样,我对如何处理模块结构或导入语句有些误解?


通配符导入导入该模块中全局命名空间中定义的所有内容。它不区分"本地"类、导入的模块、函数或变量。

有两种方法可以解决这个问题:

  • 完全导入所需内容,而不是使用Wildwards。根据import this的说法,显式优于隐式。
  • 使用特殊的__all__变量精确定义当模块是通配符导入时应导入的内容。看有人能用python解释一下吗?