我只是碰到这种意外的行为在无意中发现蟒蛇(包括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模块名称解析这种方式工作,即什么样的规则和原理都是做这种方式
注:这被标记为a question重复有无关模块别名:别名是不是在这个问题甚至提到的(这是关于imp从一个软件包中删除子模块)或最佳答案。虽然这个问题的答案提供了与这个问题有关的信息,但这些问题本身甚至不是类似于恕我直言。
因为导入机制'import X'或'from X import Y'不检查变量X的值,它搜索名为'X'的文件/文件夹 – Copperfield
而不是'from regexp import search'和'从pickle import dump',为什么不只是'search = regexp.search'和'dump = pickle.dump'? –
@suspiciousdog,为什么_wouldn't_我使用'从X导入Y'形式?它是标准的语法,非常非常pythonic(只需要在PEP 8中提到)。 – alexis