《Python核心編程》第二版第326頁第十二章練習 續一 -Python核心編程答案-自己做的-

來源:互聯網
上載者:User

這是自己做的練習,可能有錯誤,歡迎討論和各種最佳化重構方案。

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.