gpt4 book ai didi

python - __path__ 有什么用?

转载 作者:IT老高 更新时间:2023-10-28 20:27:41 24 4
gpt4 key购买 nike

在今天之前,我从未注意到在我的一些包上定义的 __path__ 属性。根据文档:

Packages support one more special attribute, __path__. This is initialized to be a list containing the name of the directory holding the package’s __init__.py before the code in that file is executed. This variable can be modified; doing so affects future searches for modules and subpackages contained in the package.

While this feature is not often needed, it can be used to extend the set of modules found in a package.

有人可以向我解释这到底是什么意思,以及我为什么要使用它吗?

最佳答案

这通常与 pkgutil 一起使用让一个包在磁盘上布局。例如,zope.interface 和 zope.schema 是独立的发行版(zope 是一个“命名空间包”)。您可能在 /usr/lib/python2.6/site-packages/zope/interface/ 中安装了 zope.interface,而在 /home/me 中更多地使用 zope.schema/src/myproject/lib/python2.6/site-packages/zope/schema.

如果你把 pkgutil.extend_path(__path__, __name__) 放在 /usr/lib/python2.6/site-packages/zope/__init__.py 那么两个zope .interface 和 zope.schema 将是可导入的,因为 pkgutil 会将 __path__ 更改为 ['/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,但更了解路径上的 zip。

手动更改 __path__ 并不常见,也可能没有必要,但在调试命名空间包的导入问题时查看变量很有用。

您也可以使用 __path__ 进行猴子补丁,例如,我有时会通过在 sys 早期创建文件 distutils/__init__.py 来对 distutils 进行猴子补丁.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...

关于python - __path__ 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2699287/

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