Как получить доступ к модулю стандартной библиотеки в Python, когда есть локальный модуль с тем же именем? - PullRequest
15 голосов
/ 14 декабря 2009

Как получить доступ к модулю стандартной библиотеки (скажем, по математике), если файл prog.py находится в том же каталоге, что и локальный модуль с тем же именем (math.py)?

Я задаю этот вопрос, потому что я хотел бы создать пакет uncertainties, который можно использовать как

import uncertainties
from uncertainties.math import *

Таким образом, внутри каталога неопределенностей есть локальный математический модуль. Проблема в том, что я хочу получить доступ к стандартному библиотечному математическому модулю из неопределенности / __ init __. Py.

Я предпочитаю не переименовывать неопределенности. Потому что этот модуль точно предназначен для замены функций из математического модуля (эквивалентами, которые обрабатывают числовые неопределенности).

PS: этот вопрос относится к модулю, который я написал для выполнения вычислений с неопределенностью с учетом корреляции между переменными.

Ответы [ 2 ]

20 голосов
/ 14 декабря 2009

Вы ищете Абсолютный / Относительный импорт от PEP 328 , доступный с 2,5 и выше .

В Python 2.5 вы можете переключить поведение импорта на абсолютный импорт, используя директиву from __future__ import absolute_import. Такое поведение абсолютного импорта станет будущим по умолчанию в будущей версии (вероятно, Python 2.7). Если абсолютный импорт установлен по умолчанию, математика импорта всегда найдет версию стандартной библиотеки. Предполагается, что пользователи должны начать использовать абсолютный импорт в максимально возможной степени, поэтому предпочтительно начинать запись из строки импорта pkg в вашем коде.

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

from __future__ import absolute_import
# Import uncertainties.math
from . import math as local_math
import math as sys_math
5 голосов
/ 14 декабря 2009

Почему вы не можете переименовать свой локальный модуль снова?

Очевидно, что это не «полная» замена, если вам все еще нужны вещи из установленного uncertainties.

Так как это частичная замена, вы не должны давать ему то же имя.

Что отличается? Что то же самое? Выберите лучшее имя на основе этого.

...