Python: как импортировать модуль с тем же именем, что и подпакет?

Я еще не сталкивался с этой проблемой, но мне интересно, как импортировать модуль с тем же именем, что и подпакет. Например, возможная модульная структура может выглядеть так:

mymodule\
    __init__.py
    string.py

А что, если мне нужен подпакет mymodule.string и модуль string, поставляемый с каждым дистрибутивом Python из пакета, находящегося в том же каталоге, например __init__.py? Следующие строки кода all импортируют подпакет.

from   .                import string
import mymodule.string  as string
import string

person Niklas R    schedule 21.02.2012    source источник


Ответы (2)


В Python 2.5 или 2.6 вы можете использовать:

>>> from __future__ import absolute_import

Что говорит Python, что все импорты, которые явно не являются относительными, должны рассматриваться как абсолютные. То есть, после использования этого объявления вы можете получить доступ как к встроенному строковому модулю, так и к вашему собственному строковому модулю, используя:

>>> import string as the_builtin_string_module
>>> from . import string as my_package_string_module

Я считаю, что это становится значением по умолчанию в Python 2.7 (и Python 3.0).

Для получения дополнительной информации см.: http://www.python.org/dev/peps/pep-0328/#rationale-for-absolute-imports

person Edward Loper    schedule 21.02.2012

Вам не нужно импортировать его как импорт верхнего уровня.

Просто import mymodule.string, foo = mymodule.string.baz() и т. д.

Если вы действительно хотите использовать подпакет как string, вы можете import его как string, но сначала сделайте что-то вроде import string as builtinstring

person Tyler Eaves    schedule 21.02.2012
comment
Я не думаю, что это сработает. встроенная строка станет mymodule.string. - person capybaralet; 25.02.2015