我只是碰到這種意外的行爲在無意中發現蟒蛇(包括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