__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 导入还公开了我使用的模块,不仅是我自己的类[重复]的主要内容,如果未能解决你的问题,请参考以下文章
`__init __。py`导入多个模块,而文件中没有使用它们
从__init__.py中的函数导入模块将模块对象绑定到全局命名空间?