__path__ 有什么用?

2023-11-25

我从来没有注意到__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(使用前将#替换为@)

__path__ 有什么用? 的相关文章

随机推荐