Python: импорт и изменение канонических имен в текущем модуле - PullRequest
4 голосов
/ 24 февраля 2012

В каталоге пакетов 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.

Ответы [ 2 ]

2 голосов
/ 28 июля 2012

У меня была такая же проблема. Вы можете изменить имя модуля в своем определении Boost.Python:

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

Проблема справки - это отдельная проблема. Я думаю, вам нужно добавить каждый элемент в __all__, чтобы экспортировать его, чтобы помочь.

Когда я выполняю оба этих действия, имя foo.MyCppClass - это просто - foo.MyCppClass - и help(foo) предоставляет документацию для MyCppClass.

1 голос
/ 28 февраля 2012

Вы можете решить проблему help(), добавив строку

__all__ = ['MyCppClass']

в файл __init__.py.

...