__init__.py 导入的还包括我使用的模块,不仅仅是我自己定义的类。

16 浏览
0 Comments

__init__.py 导入的还包括我使用的模块,不仅仅是我自己定义的类。

这个问题已经在此处有解答:

Python 中 __all__ 的含义是什么?

我对 Python 的导入方式还有点不太明白。我已经阅读了数十篇文章,但都没有找到一个令人满意的答案。情况如下:

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

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

现在,在模块 1 中:

    from math import sqrt  # a tool that I need
    class class1:
    class class2:
    ....
    class class100:

我的问题是,当我在另一个项目中进行

    import pack1

时,我在 pack1 的命名空间中看到了 sqrt。我是否需要在 __init__.py 文件中单独导入这 100 个类中的每一个,以避免这种情况并保持我的命名空间干净?我是否需要在 __init__.py 中使用 inspect 模块进行某些 hack,以识别已定义但未导入的类(我认为这将非常丑陋)?或者,正如我所怀疑的那样,我误解了如何处理模块结构或导入语句的某些内容?

admin 更改状态以发布 2023年5月22日
0
0 Comments

通配符导入会导入模块中全局命名空间中定义的所有内容,它不区分“本地”类、已导入的模块、函数或变量。\n\n有两种方法可以解决这个问题:\n1. 导入你想要的东西,而不是使用通配符。根据“import this”的说法,显式胜过隐式。\n2. 使用特殊的“__all__”变量来定义模块在通配符导入时应该导入哪些内容。请参阅“Can someone explain __all__ in Python?”。

0