Почему я не могу импортировать из псевдонима модуля?
Я просто наткнулся на это неожиданное поведение в Python (2.7 и 3.x):
>>> import re as regexp
>>> regexp
<module 're' from '.../re.py'>
>>> from regexp import search
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'regexp'
Конечноfrom re import search
успешно, как это было бы до того, как я создал псевдоним. Но почему я не могу использовать псевдонимregexp
, который теперь известный модуль, в качестве источника для импорта имен?
Это создает неприятный сюрприз, когда есть несколько вариантов модуля: скажем, я все еще использую Python 2 и хочу использовать версию Cpickle
, cPickle
, Если я тогда попытаюсь импортировать имя изpickle
, он будет извлечен из простогоpickle
модуль (и я не буду замечать, так как он не выдает ошибку!)
>>> import cPickle as pickle
>>> from pickle import dump
>>> import inspect
>>> inspect.getsourcefile(dump)
'.../python2.7/pickle.py' # Expected cPickle.dump
К сожалению!
Осматривая я вижу чтоsys.modules
включает в себя реальное имя модуля (re
или жеcPickle
, но не псевдонимregexp
или жеpickle
, Это объясняеткак второй импорт завершается неудачно, но неЗачем Разрешение имен модулей Python работает таким образом, то есть каковы правила и обоснования для этого.
Замечания: Это было отмечено как дубликатвопрос это не имеет ничего общего с псевдонимами модулей: псевдонимы даже не упоминаются в вопросе (речь идет об импорте подмодулей из пакета) или в верхних ответах. Хотя ответы на этот вопрос дают информацию, относящуюся к этому вопросу, сами вопросы даже не похожи на ИМХО.