Python:在当前模块中导入和更改规范名称

时间:2012-02-24 18:38:37

标签: python import canonical-name

在我自己创建的Python包目录中,我有一个__init__.py文件,上面写着:

from _foo import *

在同一目录中有一个_foomodule.so,由上面加载。共享库是用C ++实现的(使用Boost Python)。这让我说:

import foo
print foo.MyCppClass

这很有效,但有一个怪癖:Python通过完整的包路径知道该类,这使得它打印出来:

foo._foo.MyCppClass

因此,虽然MyCppClassfoo中作为别名存在,但foo.MyCppClass不是其规范名称。除了有点难看之外,这也会使help()有点蹩脚:help(foo)会说foo包含一个模块_foo,并且只有当你说help(foo._foo)时才会这样做获取MyCppClass

的文档

我可以在__init__.py或其他方面做些不同的事情,以便Python将foo.MyCppClass视为规范名称吗?

我正在使用Python 2.7;如果解决方案也适用于2.6,那将会很棒。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。您可以在Boost.Python定义中更改模块名称:

BOOST_PYTHON_MODULE(_foo)
{
  scope().attr("__name__") = "foo";
  ...
}

帮助问题是一个单独的问题。我认为您需要将每个项目添加到__all__以将其导出为帮助。

当我同时执行这两项操作时,foo.MyCppClass的名称就是 - foo.MyCppClass - help(foo)提供了MyCppClass的文档。

答案 1 :(得分:1)

您可以通过添加行

来解决help()问题
__all__ = ['MyCppClass']

到您的__init__.py文件。