我从来没有注意到__path__
今天之前在我的一些包上定义的属性。根据文档:
套餐支持多一特价
属性,__path__
。这是
初始化为一个列表,其中包含
保存目录的名称
包的__init__.py
代码之前
在该文件中被执行。这
变量可以修改;这样做
影响未来对模块的搜索
以及包含在的子包
包裹。
虽然这个功能并不常见
需要时,它可以用来扩展
包中找到的一组模块。
有人可以向我解释这到底意味着什么以及为什么我想使用它吗?
这通常与pkgutil让包分布在磁盘上。例如,zope.interface 和 zope.schema 是单独的发行版(zope
是一个“命名空间包”)。您可能已经安装了 zope.interface/usr/lib/python2.6/site-packages/zope/interface/
,当您在本地更多地使用 zope.schema 时/home/me/src/myproject/lib/python2.6/site-packages/zope/schema
.
如果你把pkgutil.extend_path(__path__, __name__)
in /usr/lib/python2.6/site-packages/zope/__init__.py
那么 zope.interface 和 zope.schema 都可以导入,因为 pkgutil 会发生变化__path__
to ['/usr/lib/python2.6/site-packages/zope', '/home/me/src/myproject/lib/python2.6/site-packages/zope']
.
pkg_resources.declare_namespace
(Setuptools 的一部分)就像pkgutil.extend_path
但更了解路径上的拉链。
手动更改__path__
尽管在调试命名空间包的导入问题时查看该变量很有用,但这种情况并不常见,而且可能没有必要。
您还可以使用__path__
对于monkeypatching,例如,我有时通过创建文件来进行monkeypatched distutilsdistutils/__init__.py
那是早期的sys.path
:
import os
stdlib_dir = os.path.dirname(os.__file__)
real_distutils_path = os.path.join(stdlib_dir, 'distutils')
__path__.append(real_distutils_path)
execfile(os.path.join(real_distutils_path, '__init__.py'))
# and then apply some monkeypatching here...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)