gpt4 book ai didi

python import package - 子包不应该出现在符号表中

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

我想知道为什么在导入包时,python 包中包含子模块的目录(子包)显示为一个符号。例如,如果我有这个包:

PyModTest/                        Top-level package
__init__.py Initialize the package
Source/ Subpackage holding source files
__init__.py
WildMod.py Submodule containing a function: 'WildFunc'

顶级 __init__.py 如下所示:

#!/usr/bin/env python

from Source.WildMod import WildFunc

并且,为了完整起见,较低级别的 __init__.py 如下所示:

#!/usr/bin/env python

__all__ = ["WildMod"]

好的,现在我打开解释器,导入模块,然后查看符号:

>>> import PyModTest
>>> dir(PyModTest)
['Source', 'WildFunc', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']

看,“Source”模块出现了,尽管我从未专门导入过它!

我想看到的唯一符号(除了私有(private)符号)是我的“WildFunc”。有什么方法可以隐藏“Source”包吗?

最佳答案

这里需要注意两点:

  • 在 Python 中,模块是实际的对象,出现在它们名称之间的点表示实际的属性访问
  • 您正在进行相对导入,这意味着 Source实际上是PyModTest.Source (感谢 TokenMacGuy 指出这一点)

所以:为了导入PyModTest.Source.WildMod.WildFunc , Python 必须

  1. 进口PyModTest (你已经完成了)
  2. 检查它是否有一个名为 Source 的属性,如果没有,则通过从 PyModTest/Source/__init__.py 导入它来创建属性
  3. 检查并查看它是否具有名为 WildMod 的属性,如果没有,则通过从 PyModTest/Source/WildMod.py 导入它来创建属性
  4. 检查并查看它是否具有名为 WildFunc 的属性(它确实如此)

一些相关细节在 PEP 302 中讨论在Python language reference .

Deeper down in the mechanism, a dotted name import is split up by its components. For "import spam.ham", first an "import spam" is done, and only when that succeeds is "ham" imported as a submodule of "spam".

如果你不想有一个名为 Source 的变量,这很容易修复:只需 del Source导入函数后。但请记住,它会阻止以后运行的任何代码访问 PyModTest.Source.<anything>。 (除了 WildFunc ,因为您已经保存了对它的引用)。我肯定会建议忽略对 Source 的引用,不删除它,因为它不会伤害任何东西。

关于python import package - 子包不应该出现在符号表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8541716/

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