Я просто наткнулся на это неожиданное поведение в 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, и я хочу использовать версию C pickle
, 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 разрешение имен работает таким образом, то есть, какие правила и обоснования предназначены для этого.
Примечание. Это было отмечено как дубликат вопроса, который не имеет ничего общего с псевдонимом модуля: aliasing даже не упоминается в вопрос (который касается импорта подмодулей из пакета) или верхние ответы. Хотя ответы на этот вопрос предоставляют информацию, относящуюся к этому вопросу, сами вопросы не похожи даже на ИМХО.