2013-12-03 4 views
1
package 
    1) module1 
    2) module2 
    3) module3 
    4) __init__.py 

, что я хочу сделать, этоКак получить текущий модуль, импортируемый в файл __init__.py?

  1. импорт package
  2. тогда я мог бы использовать некоторые подкаталоги модули в module1, module2 непосредственно, просто выглядит, как если бы я импортировать его следующим образом:

    import module1 
    

Если я использую imp.load_module в __init__.py для загрузки module1, тогда dir(package1) будет иметь "module1", "module2" в sys.modules, но мне все еще нужно использовать package.modules1, чтобы получить к нему доступ. Я заметил, что когда я импортирую package, я получу пакет объектов 'module'. Если я обновляю встроенный метод пакета, он обманет систему, чтобы сделать видимым module1.

>>> import package 
>>> package.__dict__.update(package.module1.__dict__) 

тогда все выглядит хорошо, и это, кажется, Python module1 был импортирован как import module1 и я мог бы использовать класс или модули в module1 непосредственно.

Тогда возникает мой вопрос --- Как определить текущий объект модуля в __init__.py? Я пробовал imp.find_module, но, похоже, он не возвращает объект модуля.

ОК, я обновляю проблему здесь. Во-первых, module1 действительно то, что я хочу использовать в коде, но зависит от модулей2 и модуля3, а модули module1, module2 и module3 - от кода с открытым кодом. Чтобы синхронизировать его с последней версией, поэтому модуль1,2,3 остается тем, на что он похож после распаковки. Нам нужно обернуть модуль1, чтобы доказать некоторый интерфейс другим парням, они ожидали, что модуль1 будет виден при вызове «import module1» Однако, поскольку это зависит от модуля2,3, поэтому он не может быть вызван. Поэтому я хочу обернуть его в новый «пакет» или просто переименовать «пакет» в «module1», поэтому , когда другие называют «импортный пакет», он прозрачно сделает пространство имен module1 видимым для вызывающего. теперь я мог бы использовать imp.load_module для загрузки module1, но когда я назвал реж (пакет), это выглядит следующим образом:

>>> import package 
>>> print dir(package) 
    ['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'module1'] 
>>> print type(package.modue1) 
type<'module'> 

Так module1 еще не виден непосредственно к абоненту. я заметил, что я мог бы обновить функцию атрибута и член модуля, если я использую хитрый способ, как это:

>>> import package (this will triger calling __init__.py) 
>>> package.__dict__.update(package.module1.__dict__) 

после этого, все выглядит, как если бы я только что назвал «импорт module1». Тем не менее, я не смог получить объект модуля после возврата «import», интересно, есть ли какой-либо способ загрузить модуль dict в init .py?

+0

Что вы подразумеваете под «текущим модулем»? –

+0

import packege, тогда пакет является moulde объектом для python, я могу псевдоним, однако я не мог получить объект модуля при возврате «import», интересно, можно ли получить объект модуля в его __init__.py файле? – python

+0

Извините, но это выглядит запутанной проблемой. Не могли бы вы уточнить свои проблемы и формулировки? – Drake

ответ

1

Зачем вы хотите это сделать? Явный лучше, чем неявный!

Импортируйте все, что ваш API хочет выставить в __init__, а затем пусть люди используют from package import *. Используйте __all__, чтобы явно указать, что именно следует экспортировать.

В __init__.py используйте:

import module1 
import module2 

__all__ = ['module1', 'module2'] 

и оставить импортирования все для пользователей. Они должны иметь выбор, не имеют на них модули.

Или, если вы имели в виду вещи из вложенных модулей, чтобы быть видимыми в package, импортировать их в явном виде, или использовать from modulename import * там тоже (но добавить __all__ список для таких модулей):

from module1 import * 
from module1 import __all__ as module1_exported 
from module2 import * 
from module2 import __all__ as module2_exported 

__all__ = module1_exported + module2_exported 

Добавление предметов в __builtins__ означает, что вы сделали видимыми имена всюду, а не только на то, что импортировало ваш package. Редко возникает необходимость возиться со встроенными модулями.

+0

ОК, я попробую – python

+0

Я обновляю свою проблему, __all__ не кажется правильным. – python

Смежные вопросы