【发布时间】:2012-03-15 05:23:38
【问题描述】:
在我自己创建的 Python 包目录中,我有一个 __init__.py 文件,上面写着:
from _foo import *
在同一个目录下有一个_foomodule.so,它是由上面加载的。共享库是用 C++ 实现的(使用 Boost Python)。这让我说:
import foo
print foo.MyCppClass
这可行,但有一个怪癖:Python 通过完整的包路径知道该类,这使得它可以打印:
foo._foo.MyCppClass
因此,虽然 MyCppClass 在 foo 中作为别名存在,但 foo.MyCppClass 并不是它的规范名称。除了有点丑之外,这也让help() 有点蹩脚:help(foo) 会说 foo 包含一个模块 _foo,只有当你说 help(foo._foo) 时,你才会得到 MyCppClass 的文档。
我是否可以在 __init__.py 中做一些不同的事情或以其他方式使 Python 将 foo.MyCppClass 视为规范名称?
我使用的是 Python 2.7;如果该解决方案也适用于 2.6,那就太好了。
【问题讨论】:
-
如果
_foo模块是用 Python 编写的,我会告诉你更改类的__module__属性(你可以在定义每个类之后执行此操作,或者编写一个循环一次全部完成)但是该属性可能在您的 C++ 类上不可写...也许有一些方法可以在 Boost 中更改该属性? (我自己从来没用过。) -
我觉得可以改模块名,但是改成什么?我不想从
foo._foo.MyCppClass转到foo.bar.MyCppClass- 我只想以foo.MyCppClass作为 Python 中的规范名称。
标签: python import canonical-name