这是自己做的练习,可能有错误,欢迎讨论和各种优化重构方案。
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', 'encoding s.encodings', 'abc', 'encodings.cp437', '_weakrefset', 'errno', 'encodings.codecs', 'sre_constants', 're', '_abcoll', 'ntpath', '_codecs', 'nt', '_war nings', 'genericpath', 'stat', 'zipimport', 'encodings.__builtin__', 'warnings', 'UserDict', 'encodings.cp1252', 'sys', 'codecs', 'os.path', '_functoo ls', '_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', 'encoding s.encodings', 'abc', 'encodings.cp437', '_weakrefset', 'errno', 'encodings.codecs', 'sre_constants', 're', '_abcoll', 'ntpath', '_codecs', 'nt', '_war nings', 'genericpath', 'stat', 'zipimport', 'encodings.__builtin__', 'warnings', 'UserDict', 'encodings.cp1252', 'sys', 'codecs', 'os.path', '_functoo ls', '_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