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

Is __init__.py run everytime I import anything from that module?

本问题已经有最佳答案,请猛点这里访问。

我有一个叫做core的模块,它包含许多python文件。

如果我这样做:

1
from core.curve import Curve

是否有人打电话给__init__.py?我可以将适用于所有核心文件的导入语句移到__init__.py中以保存重复的内容吗?__init__.py中应该包含什么?


I've got a module called core, which contains a number of python files.

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

If I do: from core.curve import Curve does __init__.py get called?

它从未被"调用"——它不是一个函数——但是当包或它的某个子模块在一个进程中第一次被导入时,它就被加载了。然后储存在sys.modules中,随后的进口产品会在那里找到它。

Can I move import statements that apply to all core files into init.py to save repeating myself?

不。名称空间是每个模块,而不是每个包。无论如何,这将是一个非常糟糕的主意,在这种情况下,你所说的"重复你自己"在维护你的代码时是一个真正的帮助者(明确的导入意味着你不含糊地知道哪个符号来自哪个模块)。

What should go into init.py?

从技术上讲,你可以把你想要的任何东西放在你的__init__.py文件中,但通常它们都是空的。一些已知的用例将其用作包子模块的外观,根据当前平台或某些环境变量等为通用API选择具体的实现。

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


您可以添加所有要在目录中使用的函数

1
2
- core
  - __init__.py

在此__init__.py中,添加类和函数引用,如

1
2
from .curve import Curve
from .some import SomethingElse

你想在哪里使用你的类,就像这样

1
from core import Curve


Is __init__.py run everytime I import anything from that module?

根据文件,在大多数情况下是的。