我想知道为什么在导入包时,python包中包含子模块的目录(子包)会显示为符号.例如,如果我有这个包:
PyModTest/ Top-level package
__init__.py Initialize the package
Source/ Subpackage holding source files
__init__.py
WildMod.py Submodule containing a function: 'WildFunc'
Run Code Online (Sandbox Code Playgroud)
顶级__init__.py看起来像这样:
#!/usr/bin/env python
from Source.WildMod import WildFunc
Run Code Online (Sandbox Code Playgroud)
并且,为了完整起见,下级__init__.py看起来像这样:
#!/usr/bin/env python
__all__ = ["WildMod"]
Run Code Online (Sandbox Code Playgroud)
好的,现在我打开解释器,导入模块,然后查看符号:
>>> import PyModTest
>>> dir(PyModTest)
['Source', 'WildFunc', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
Run Code Online (Sandbox Code Playgroud)
看,"源"模块出现了,即使我从未专门导入它!
我想看到的唯一符号(除了私有符号)是我的'WildFunc'.有没有办法隐藏'Source'包?
这里有两点需要注意:
Source实际上PyModTest.Source(感谢TokenMacGuy指出这一点)所以:为了导入PyModTest.Source.WildMod.WildFunc,Python必须这样做
PyModTest(已经由您完成)Source,如果没有,则通过从中导入属性来创建该属性PyModTest/Source/__init__.pyWildMod,如果没有,则通过从中导入来创建属性PyModTest/Source/WildMod.pyWildFunc(它有)PEP 302和Python语言参考中讨论了一些相关的细节.
更深入的机制,点名称导入由其组件分开.对于"
import spam.ham",首先执行"import spam",并且仅当成功时"ham"作为" "的子模块导入spam.
如果您不希望命名变量Source,那么很容易修复:del Source在导入函数之后.但请记住,它将阻止以后运行的任何代码访问PyModTest.Source.<anything>(除非WildFunc,因为您已保存对该引用的引用).我肯定会建议忽略引用Source,而不是删除它,因为它不会伤害任何东西.
| 归档时间: |
|
| 查看次数: |
1739 次 |
| 最近记录: |