__init__.py 导入还公开了我使用的模块,不仅是我自己的类[重复]

Posted

技术标签:

【中文标题】__init__.py 导入还公开了我使用的模块,不仅是我自己的类[重复]【英文标题】:__init__.py imports expose also modules I use, not only my own classes [duplicate] 【发布时间】:2018-09-27 01:15:24 【问题描述】:

关于 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 中的检查模块进行一些修改,以识别已定义但未导入的类(我认为这会很丑陋)?或者,正如我所怀疑的,我在应该如何处理模块结构或导入语句方面弄错了?

【问题讨论】:

你为什么不呢?它在那个命名空间中。参见例如docs.python.org/3/tutorial/… 是的,我表达得很糟糕;我知道事情完全按照预期工作,我的问题是如何进行干净的通配符导入,因为我想导入许多名称并显式导入它们会很乏味。 您正在解释为什么通配符导入被许多 Python 开发人员认为是不好的做法的原因之一。 【参考方案1】:

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

有两种解决方法:

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

【讨论】:

__all__ 变量是我优雅地处理通配符导入所缺少的部分。非常感谢!

以上是关于__init__.py 导入还公开了我使用的模块,不仅是我自己的类[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python __init__.py 作用详解

三 Flask+ MySQL 数据库操作

`__init __。py`导入多个模块,而文件中没有使用它们

从__init__.py中的函数导入模块将模块对象绑定到全局命名空间?

尽管有 __init__.py,Python 仍无法导入自定义模块

如何在包中只导入没有 exec __init__.py 的子模块