我什么时候需要修改 Python __init__ 文件?
When do I need to modify a Python __init__ file?
假设您创建了一个名为 app
的 Python 包,它包含一个名为 foo
的模块,该模块具有一个名为 say_hello
的函数,它打印出 Hello!
到控制台。
假设您还创建了另一个名为 boss_app
的 Python 包,它有一个模块 main
。 app
和boss_app
在同一个目录下,目录在Python路径下。此外,__init__
文件都是空白的。结构是:
app
__init__.py
foo.py
boss_app
__init__.py
main.py
我想将 app
导入 boss_app.main
以便我可以调用 app.foo.say_hello
.
我使用这个命令:
import app
app.foo.say_hello()
我希望在控制台中看到:
>>>> Hello!
相反,我得到的行为是 app
被导入 但 它无法访问 foo
.
我想到的解决方案是修改app.__init__
,使其包含以下命令:
from .foo import *
现在我得到了预期的行为。
如果某个包要从外部包导入,是否总是需要为该包定制 __init__
?
说
import app
仅运行 app/__init__.py
并使其初始化的所有内容都可用作 app.SOMENAME
。如果你想让 app.foo
模块可用,你需要说 import app.foo
。这将加载模块。这种区别的一个常见示例可能是 import os
与 import os.path
。仅仅因为你说 import os
,你将无法获得 os.path
包的内容。
您不必将模块分解成包,但这有助于避免 module-name 冲突。它还可能有助于使这些模块的用户头脑中的概念保持清晰。
假设您创建了一个名为 app
的 Python 包,它包含一个名为 foo
的模块,该模块具有一个名为 say_hello
的函数,它打印出 Hello!
到控制台。
假设您还创建了另一个名为 boss_app
的 Python 包,它有一个模块 main
。 app
和boss_app
在同一个目录下,目录在Python路径下。此外,__init__
文件都是空白的。结构是:
app
__init__.py
foo.py
boss_app
__init__.py
main.py
我想将 app
导入 boss_app.main
以便我可以调用 app.foo.say_hello
.
我使用这个命令:
import app
app.foo.say_hello()
我希望在控制台中看到:
>>>> Hello!
相反,我得到的行为是 app
被导入 但 它无法访问 foo
.
我想到的解决方案是修改app.__init__
,使其包含以下命令:
from .foo import *
现在我得到了预期的行为。
如果某个包要从外部包导入,是否总是需要为该包定制 __init__
?
说
import app
仅运行 app/__init__.py
并使其初始化的所有内容都可用作 app.SOMENAME
。如果你想让 app.foo
模块可用,你需要说 import app.foo
。这将加载模块。这种区别的一个常见示例可能是 import os
与 import os.path
。仅仅因为你说 import os
,你将无法获得 os.path
包的内容。
您不必将模块分解成包,但这有助于避免 module-name 冲突。它还可能有助于使这些模块的用户头脑中的概念保持清晰。