每次从该模块导入任何东西时都会运行__init__.py吗?

时间:2017-07-31 13:18:49

标签: python python-3.x

我有一个名为core的模块,其中包含许多python文件。

如果我这样做:

from core.curve import Curve

__init__.py会被调用吗?我可以将适用于所有核心文件的import语句移动到__init__.py以保存重复吗?什么应该进入__init__.py

3 个答案:

答案 0 :(得分:1)

  

我有一个名为core的模块,其中包含许多python文件。

如果它包含python文件,它不是一个模块,它是一个包含python文件的目录 - 如果它包含一个__init__.py文件,最终是一个包。

  

如果我这样做:from core.curve import Curve__init__.py被召唤吗?

从来没有"叫" - 它不是一个函数 - 但是它会在第一次在一个进程中导入包或其中一个子模块时加载。然后将其存储在sys.modules中,随后的导入将在那里找到它。

  

我可以将适用于所有核心文件的导入语句移动到 init .py中以保存重复吗?

不。命名空间是每个模块,而不是每个包。无论如何,这将是一个非常糟糕的主意,你的名字和#34;重复自己"在这种情况下,在维护代码方面是一个真正的帮助(显式导入意味着你不知道哪个符号来自哪个模块)。

  

init .py?

应该包含哪些内容

从技术上讲,你实际上可以在你的__init__.py文件中放置任何你想要的东西,但通常它们只是空的。一个已知的用例是using it as a facade用于包的子模块,为基于当前平台或某些环境变量等的公共API选择具体实现...

哦,是的:它也是一个添加关于你的包(版本,作者等)的元信息的好地方。

答案 1 :(得分:0)

  

每次从该模块导入任何东西时都会运行__init__.py吗?

根据https://github.com/aNNiMON/Lightweight-Stream-API大多数情况,它是。

答案 2 :(得分:0)

您可以添加要在目录中使用的所有功能

__init__.py

在此from .curve import Curve from .some import SomethingElse 中添加类和函数引用,如

from core import Curve

以及你想要的用户你的班级只需像

那样引用它
text='''
printf "Proxy authentication failed.
read -s -p "Enter Password to try again: " mypassword
printf "Proxy authentication succeeded
'''