python中的名字空间


在python中,名字空间是名字和实例的对应。当解释器启动时,内建名字的名字空间被建立,他们被看作是模块__builtin__的名字空间;当模块被载入的时候,模块的名字空间被建立;正在执行的文件或是交互命令的名字空间被看作是__main__的名字空间。

范围(scope)是python代码中可以直接使用某一名字空间的区域。

在执行的任何时间都至少有三个名字空间,一个是本地名字空间,包括最近函数内的名字;一个是模块的名字空间,包括模块中的全局变量;还有一个是__builtins__的名字空间。使用顺序由前到后。赋值都是在本地名字空间中发生的,import和函数定义的作用是将模块或是函数名绑定到本地名字空间中。


################################
看看文件的组织结构:
使用dir()可以查看某个模块定义的名字。

__name__中间总是当前模块的名字字符串。

在python中一个python文件就是一个模块(module)。使用模块这个名字是因为更好的体现了模块体现了名字空间,不像在c中间的那样名字空间和文件有关,但还是使用文件这个名字。

模块的集合就是包(package)。实际上就是文件的组合形成了目录一样(python中包和模块是一个类型)。与普通目录不同的是在每一个包的目录中都有一个__init__.py文件。这个文件可以是空的,也可以是有一些初始化代码的。用户可能需要在__init__.py中定义__all__。这个变量包含了包中间的公开的模块名(模块中的__all__包括了模块的API)。当使用from package import *时,被引入的是定义在__all__中的名字(使用import时,没有这个效果)。


#######################
下面看看关键字:
import的作用是有两部分,发现并初始化模块,然后是在本地名字空间中定义名字。语法如下:
import_stmt ::= "import" module ["as" name] ( "," module ["as" name] )*
  | "from" module "import" identifier ["as" name]
    ( "," identifier ["as" name] )*
  | "from" module "import" "(" identifier ["as" name]
    ( "," identifier ["as" name] )* [","] ")"
  | "from" module "import" "*"
module ::= (identifier ".")* identifier