python - 在 Python 中重新打开包

标签 python

也许这是不可能的(我更习惯Ruby,这种事情很好)。我正在编写一个库,为 docker-py 提供附加功能,它提供 docker包,所以你只需import docker然后您可以访问 docker.Client等等

因为这似乎是一个合乎逻辑的命名方案,我希望用户使用 import docker.mymodule 拉入我的项目。 ,所以我创建了一个名为 docker 的目录与 __init__.py ,和mymodule.py里面。

当我尝试访问docker.Client时,Python看不到,好像我的docker包已隐藏它:

import docker
import docker.mymodule

docker.Client() # AttributeError: 'module' object has no attribute 'Client'

这可能吗,或者源树之间的所有顶级包名称都必须不同吗?

最佳答案

这只有在 docker 设置为 namespace package 时才可能实现。 (其中 it isn't )。

参见zope.schema , zope.interface等命名空间包的示例(zope 是此处的命名空间包)。由于 zopesetup.py 中被声明为命名空间包,这意味着 zope 并不引用文件系统,而是由多个包共享的命名空间。这也意味着 import zope 的结果几乎是未定义的 - 它只会导入在导入路径中找到的第一个 zope.* 包的顶级模块。

因此,在处理命名空间包时,您需要使用 import zope.schemafrom zope import schema 显式导入特定的命名空间包。

不幸的是,命名空间包没有很好的文档记录。正如 @Bakuriu 在评论中指出的,这些资源包含一些有用的信息:

关于python - 在 Python 中重新打开包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24349915/

相关文章:

python - 使用 Pyparsing 解析自定义格式(大括号分隔)文本配置

python - 从纯文本文件导入字典

python - 这个功能的大O是什么?

Python Pandas 转换列数据类型

python - 创建随机值并将其传递给具有硬边界的 Pandas 数据帧

python - "print"在 Python 3 中抛出无效语法错误

python - 没有PIP的依赖python模块的离线安装

Python:应该从 Exception 类还是从 ValueError 类派生新的 RangeError 异常?

python - 从 csv 读取并检查 IP 地址可达性

python - Tflearn 训练批处理错误说 "object of type ' Tensor' has no len()"