【问题标题】:Python: import and change canonical names in the current modulePython:在当前模块中导入和更改规范名称
【发布时间】: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

因此,虽然 MyCppClassfoo 中作为别名存在,但 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


【解决方案1】:

你可以通过添加这行来解决help()的问题

__all__ = ['MyCppClass']

到您的__init__.py 文件。

【讨论】:

  • 这是一个有趣的观点,谢谢。但是,我仍在寻找解决“真正”问题的方法……不过,修复 help() 也会很好。
【解决方案2】:

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

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

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

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

【讨论】:

  • 只是设置__name__ 似乎为我解决了这个问题。我试图找出一种方法让它完全在我做import *__init__.py 文件中工作,但我没有成功。如果我想避免更改 C++ 代码,您知道是否可以在 Python 中设置__name__?谢谢!
猜你喜欢
  • 2018-10-28
  • 2012-02-18
  • 1970-01-01
  • 2015-05-21
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
相关资源
最近更新 更多