gpt4 book ai didi

python从包中导入模块

转载 作者:太空狗 更新时间:2023-10-29 21:49:13 26 4
gpt4 key购买 nike

文件夹结构:

<current dir>
main.py
packages <dir>
__init__.py
mod.py

主程序:

import packages
print packages.mod.hello()

mod.py:

def hello():
return 'hello'

__init__.py:

from packages import mod

如果我运行 main.py,我不会收到任何错误。但是,如果我将 __init__.py 编辑为 'from packages import *' ,我会收到此错误:AttributeError: 'module' object has no attribute 'mod'

我不是在问如何使 'print' 命令起作用。我可以在 main.py 中使用其他 'import' 语法来使其工作。问题是:我很好奇 __init__.py 中的 'from packages import mod'。如果我可以执行 import mod 那么当我替换为 import * 时,这意味着导入所有内容,为什么我会收到错误?

那么 from packages import *__init__.py 中的真正含义是什么?

有人可以帮忙吗?谢谢

最佳答案

简答

那么 from packages import *__init__.py 中的真正含义是什么?

__init__.py 导入自身。

解释

您只能导入模块,不能导入包。包只是模块或子包的容器。当您“导入”一个包时,您实际上导入了模块 __init__.py

具有以下内容的__init__.py:

from packages import mod

将模块 mod 导入到 __init__.py 中。因此,它将可用通过 packages.mod 在您的 main.py 中(记住 packages__init__.py 表示)。

当您将 __init__.py 的内容更改为:

from packages import *

您正在导入模块 __init__.py,与您所在的文件完全相同。这有效(第二次导入只会触发 sys.modules 中的查找)但不会给你 mod 的内容。

这意味着,您可以使用:

from module import *

但是你不能明智地将它与一个空的__init__.py一起使用:

from package import *

因为 package 实际上是由 __init__.py 表示的里面什么都没有。您可以检查这个(交互式或在文件中):

>>> import packages
>>> print(packages)
<module 'packages' from '/.../packages/__init__.py'>

__init__.py中你可以这样写:

from packages.mod import *

然后在 main.py 中:

print packages.hello()

有效。因为函数 hello() 现在位于文件 __init__.py

在mozman的回答中提到,你可以在__init__.py中使用__all__来列出 should be imported 的模块如果使用 from packages import *。这是为这种情况设计的。

__init__.py 只有这个内容:

__all__ = ['mod']

现在您可以在 main.py 中执行此操作:

from packages import *

print mod.hello()

如果您扩展您的 __init__.py:

__all__ = ['mod']

from packages import *

您可以在 main.py 中执行此操作:

import packages

print packages.mod.hello()

但是,如果您从 __init__.py 中删除 from packages import *:

__all__ = ['mod'] 

你会得到一个错误:

AttributeError: 'module' object has no attribute 'mod'

因为 __all__ 仅用于 from packages import * 情况。现在我们回到 __init__.py 导入本身。

关于python从包中导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36515197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com