__init__.py进口也暴露了我使用的模块,而不仅仅是我自己的类

时间:2018-04-17 07:06:17

标签: python import namespaces package

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

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

    from .module1 import *
    from .module2 import *
    ...

现在,在模块1中:

    from math import sqrt  # a tool that I need

    class class1:
         <body>

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

我的问题是,当我

    import pack1

在另一个项目中,我在sqrt的命名空间中看到了pack1 。我是否必须在__init__.py文件中分别导入100个类中的每一个,以避免这种情况并保持我的名称空间清洁?我是否必须对__init__.py中的inspect模块进行一些破解,以便识别已定义但未导入的类(我认为这会非常难看)?或者,正如我怀疑的那样,我错误地说我应该如何处理模块结构或导入语句?

1 个答案:

答案 0 :(得分:1)

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

有两种解决方法:

  1. 准确导入您想要的内容,而不是使用wildwards。根据{{​​1}},显式优于隐式
  2. 使用特殊import this变量来准确定义模块通配符导入时应导入的内容。请参阅Can someone explain __all__ in Python?