這是自己做的練習,可能有錯誤,歡迎討論和各種最佳化重構方案。
12-4.
名稱空間和變數範圍。名稱空間和變數範圍有什麼不同。
【答案】
名稱空間(Namespaces)是名稱(標識符)到對象的映射。名稱空間分為局部名稱空間(Local Namespaces),全域名稱空間(Global Namespaces)和內建名稱空間(Build-in Namespaces)。
Build-in Namespaces首先被Python解譯器載入成為Active Namespaces,由__buildins__模組中的名字構成。
Global Namespaces隨後載入為Active Namespaces,可以用globals()內建函數來判斷某個名字是否屬於全域名稱空間。
Local Namespaces在有需要時,也就是如果執行期間調用了某個函數時,被載入為Active Namespaces,可以用locals()內建函數來判斷某個名字是否屬於局部名稱空間。
變數(標識符)的範圍定義為其聲明在程式裡的作用範圍(scope)。參見本書295頁。定義在函數內的變數有局部範圍,而在一個模組中最進階別的變數有全域範圍。
注意,所有局部空間的名稱都在局部作用範圍內。局部作用範圍以外的的所有名稱都在全域作用範圍內。
局部名稱空間和範圍會隨函數調用不斷變化,全域名稱空間不變。
下面的圖來自原書。加上了中文注釋,和一些修改。僅供參考。
#本文來自部落格園balian
12-5.
使用__import__()。
(a)使用__import__把一個模組匯入到你的名稱空間。你最後使用了什麼樣的文法?
(b)和上面相同,使用__import__()從指定模組匯入特定的名字。
【答案】
(a)
使用的文法是:
__import__(module_name[, globals[, locals[, fromlist]]])
代碼如下:
>>> sys = __import__('sys')>>> sys.modules.keys()['copy_reg', 'sre_compile', 'locale', '_sre', 'functools', 'encodings', 'site', '__builtin__', 'sysconfig', 'operator', '__main__', 'types', 'encodings.encodings', 'abc', 'encodings.cp437', '_weakrefset', 'errno', 'encodings.codecs', 'sre_constants', 're', '_abcoll', 'ntpath', '_codecs', 'nt', '_warnings', 'genericpath', 'stat', 'zipimport', 'encodings.__builtin__', 'warnings', 'UserDict', 'encodings.cp1252', 'sys', 'codecs', 'os.path', '_functools', '_locale', 'signal', 'traceback', 'linecache', 'encodings.aliases', 'exceptions', 'sre_parse', 'os', '_weakref']>>>
(b)【未完】感覺有些難度,概念理解上的問題,暫時押後。
12-6.
擴充匯入。建立一個importAs()函數。這個函數可以把一個模組匯入到你的名稱空間,但使用你指定的名字,而不是原始名字。例如,調用newname = importAs('mymodule')會匯入mymodule,但模組和它的所有元素都通過新名稱newname或newname.attr訪問。這是Python 2.0引入的擴充匯入實現的功能。
【答案】
代碼如下:
>>> def importAs(modulename_string):... newname = __import__(modulename_string)... return newname...>>> test = importAs('sys')>>> test.modules.keys()['copy_reg', 'sre_compile', 'locale', '_sre', 'functools', 'encodings', 'site', '__builtin__', 'sysconfig', 'operator', '__main__', 'types', 'encodings.encodings', 'abc', 'encodings.cp437', '_weakrefset', 'errno', 'encodings.codecs', 'sre_constants', 're', '_abcoll', 'ntpath', '_codecs', 'nt', '_warnings', 'genericpath', 'stat', 'zipimport', 'encodings.__builtin__', 'warnings', 'UserDict', 'encodings.cp1252', 'sys', 'codecs', 'os.path', '_functools', '_locale', 'signal', 'traceback', 'linecache', 'encodings.aliases', 'exceptions', 'sre_parse', 'os', '_weakref']>>>
【注】可以採用直接匯入sys(import sys)的方法,比較dir(sys)和sys.modules.keys()以及對應的dir(test)和test.modules.keys()的輸出結果來驗證是否正確。
12-7.
匯入鉤子。研究PEP302的匯入鉤子機制。實現你自己的匯入機制,允許編碼你的模組(encryption、bzip2、rot13等),這樣解譯器會自動解碼它們並正確匯入。你可以參看zip檔案匯入的實現(參閱第12.5.7節)。
【未完】感覺有些難度,概念理解上的問題,暫時押後。
【推薦】
一個大牛的blog
http://eishn.blog.163.com/
他也在做著本書的習題
http://hi.baidu.com/%BA%DA%B3%A4%D6%B1%CF%FE%C3%C0%D1%E6v5/home