Относительный импорт субмодуля - PullRequest
4 голосов
/ 17 января 2012

Как в Python выполнить эквивалент следующего

import http.client

, но с использованием относительного импорта:

from . import http.client
import .http.client

Для пакета http в текущем пакете?Затем я хочу получить доступ к модулю client через его родительское имя, http.client, как я смог бы, если бы я выполнял импорт верхнего уровня.

Ответы [ 3 ]

3 голосов
/ 17 января 2012

Я бы искал вдохновение в соответствующем PEP 0328 . Если вы находитесь в http.__init__.py и хотите получить доступ к клиенту:

from . import client
2 голосов
/ 17 января 2012

Я думаю, что вы ищете это:

from ..http import client
1 голос
/ 17 января 2012

Вам нужно импортировать его с от . импорт http

Однако в этот момент вы не загрузите модуль http.client и не сможете получить к нему доступ:

>>> http.client
AttributeError: 'module' object has no attribute 'client'

Существуют различные способы обойти это. Проще всего сделать это за http/__init__.py

from . import client

Другие вещи, которые вы можете сделать, это

import types
http = types.ModuleType('http')

from .http import client
http.client = client

Что вы можете сделать, если нецелесообразно изменять http/__init__.py

Однако, поскольку я предполагаю, что это по какой-то причине обеспечивает быструю замену http.client, я бы порекомендовал вам сделать это:

try:
    from .http import client
except ImportError:
    from http import client

А затем последовательно используйте имя клиента. Это определенно самое простое и красивое решение

Или, если вы не хотите использовать клиент в качестве имени:

try:
    from .http import client as http_client
except ImportError:
    from http import client as http_client
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...