9.包&&命名空间
名字空间和作用域
定义
名称空间(Namespace)是名字和对象的映射 A namespace is a mapping from names to objects 名称空间是一个字典,其中键是名字,值是对象 内建、模块、函数、类都有自己的名称空间 Python的built-in names(包括内置函数,内置常量,内置类型) 模块的全局名称global names(这个模块定义的函数,类,变量) 函数的局部名称local names 名称空间通过__dict___属性和dir( )函数查看 >>> dir(M3) ['C', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'i', 'math', 'printmsin', 'prints', 'printx', 's', 'x'] >>> list(M3.__dict__.keys()) ['prints', '__builtins__', 'printx', '__file__', 'C', '__package__', 'printmsin', 'i', 's', 'x', '__name__', '__doc__', 'math'] 作用域 作用域(Scope)即一个作用范围,表示名称空间可被访问的范围 A scope is a textual region of a Python program where a namespace is directly accessible. 语义作用域,变量的作用域完全是由变量在程序文件中源代码的位置而决定的,而不是由函数调用决定。 根据Python的命名空间,可以得到如下的作用域 内部函数的局部作用域 外层函数的局部作用域 模块的全局作用域 Python内置对象的最外层作用域 函数定义了本地作用域,模块定义了全局作用域 LEGB查找原则 当引用一个变量时,Python按以下顺序依次进行查找:从本地变量中,在任意上层函数的作用域,在全局作用域,最后在内置作用域中查找。 第一个能够完成查找的就算成功;变量在代码中被赋值的位置通常就决定了它的作用域。
作用域
作用域 作用域(Scope)即一个作用范围,表示名称空间可被访问的范围 A scope is a textual region of a Python program where a namespace is directly accessible. 语义作用域,变量的作用域完全是由变量在程序文件中源代码的位置而决定的,而不是由函数调用决定。 根据Python的命名空间,可以得到如下的作用域 内部函数的局部作用域 外层函数的局部作用域 模块的全局作用域 Python内置对象的最外层作用域 函数定义了本地作用域,模块定义了全局作用域
LEGB查找原则
当引用一个变量时,Python按以下顺序依次进行查找:从本地变量中,在任意上层函数的作用域,在全局作用域,最后在内置作用域中查找。 第一个能够完成查找的就算成功;变量在代码中被赋值的位置通常就决定了它的作用域。
功能 明确变量使用范围 防止变量名称冲突
M1.py #!/usr/bin/env python # -*- coding:UTF-8 -*- x = 1 def printx(): 'it is a module!' print x + 2 M2.py #!/usr/bin/env python # -*- coding:UTF-8 -*- x = 1 s = '测试' def printx(): 'it is a module!' print x + 2 def prints(): print s >>> from M1 import * 直接导入M1模块的全局命名空间到内存 >>> print x 1 >>> printx 全局作用域/命名空间下调用printx函数 <function printx at 0x10c2c68c0> >>> printx() 3 >>> >>> x = 10 全局作用域下/命名空间下将x值从1修改为10 >>> print x 10 >>> from M2 import * 导入M2模块,M2的命名空间直接覆盖本地全局命名空间 >>> print x x的值又被修改 1
包(Package)
定义
包(Package)是一种层次化的程序组织结构,由一系列子包和模块组成 上面图片中MOD表示当前目录 d1是MOD下面的第一级目录 d2和d3是d1下面的目录 d2m1/d2m2/d3m1/d3m2是d2和d3里面的模块 类似模块,可以通过import和from...import语法导入,可以通过点号语法访问 与模块最大不同的是,包通常由模块和__init__文件组成 包导入语句的路径中的每个目录内都必须有__init__.py这个文件,否则导入包会失败 __init__.py是一个初始化模块,Python首次导入某个目录时,会自动执行该目录下__init__.py文件中的所有代码 __init__.py文件可以直接是一个空文件,但也可以为包执行初始化语句或设置__all__等变量
语法
import package1.package2.module from package1.package2 import module
功能 解决模块命名冲突 简化模块搜索路径设置 实现模块与模块之间的关联 方便大型程序层次化组织 方便第三方组件拓展 第三方组件采用包组织来分发
举例
例1 说明 sys.path /Users/jaykingchen/MOD d1 处于当前工作目录MOD下面 __init__.py a = 1 print 'dir1' d2 __init__.py b = 2 print 'dir2' d2m1.py c = 3 print 'it is a module.py' >>> import d1.d2.d2m1 dir1 dir2 the d2m1.py >>> d1.a 1 >>> d1.d2 <module 'd1.d2' from '/Users/jaykingchen/MOD/d1/d2/__init__.py'> >>> d1.d2.b 2 >>> d1.d2.d2m1 <module 'd1.d2.d2m1' from '/Users/jaykingchen/MOD/d1/d2/d2m1.py'> >>> d1.d2.d2m1.c 3 例2 说明 包导入环境下,采用from...import语句,可以简化模块/函数/变量的调用,无需输入完整路径 >>> from d1.d2 import d2m1 >>> from d1 import d2 >>> d2.b 2 >>> d2.d2m1.c 3 dir1 dir2 the d2m1.py >>> d2m1.c 3 小结 若包目录中,所有模块名字唯一,则可以通过from...import...语句导入,简化模块中函数和变量等调用 若包目录中,有些模块的名字重叠,则需要通过import语句,之后采用点号语法进行函数/变量调用,保证唯一性
包的管理工具
定义 包管理涉及打包、分发、下载、编译、安装等环节 不同环境由不同的包管理工具来执行
工具
pip 2008年分布 pip是easy_install的取代,大量的组件基于原有的setuptools windws升级最新pip python -m pip install --upgrade pip
来源:oschina
链接:https://my.oschina.net/u/4442211/blog/3211418