python - __init__.py imports 还暴露了我使用的模块,而不仅仅是我自己的类

标签 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

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

最佳答案

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

有两种解决方法:

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

关于python - __init__.py imports 还暴露了我使用的模块,而不仅仅是我自己的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49871866/

相关文章:

c# - Visual C#中的命名空间错误

c# - 在命名空间中使用与我现在工作同名的方法

python - Pandas 中的多个直方图

python - 如何检查重复的元音

python - 在 Tensorflow-lite 中输入具有动态尺寸的图像

javascript - 为什么我不能在 jQuery(document).ready() 中调用我的 namespace ?

python - 将 Nmap 子进程中的数据直接存储到列表中

json - 吉拉。通过 JSON 导入时如何设置问题创建者?

swing - 找不到 Scala Swing 包

独立程序中的 Python 路径/导入