代码之家  ›  专栏  ›  技术社区  ›  Lester Jack

__init\uuuu。py导入还公开了我使用的模块,而不仅仅是我自己的类[重复]

  •  2
  • Lester Jack  · 技术社区  · 6 年前

    关于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\uuuu。py公司 文件以避免这种情况并保持我的命名空间干净?我必须对中的inspect模块进行一些黑客攻击吗 __init\uuuu。py公司 为了识别已定义但未导入的类(我认为这会很难看)?或者,正如我所怀疑的,我在应该如何处理模块结构或导入语句的问题上犯了一些错误?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Erik Cederstrand    6 年前

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

    有两种解决方法:

    1. 完全导入所需内容,而不是使用wildwards。 显式优于隐式 根据 import this
    2. 使用特殊 __all__ 变量,以准确定义在通配符导入模块时应导入的内容。看见 Can someone explain __all__ in Python?