import语句

翻译了Python2.5官方文档中语言参考的6.12节,半生不熟的英语水平,大家将就着看吧!
6.12 import语句

    格式:
import_stmt        ::= "import" module ["as" name] ( "," module ["as" name] )*
                                 | "from" relative_module "import" identifier ["as" name]
                                    ( "," identifier ["as" name] )*
                                 | "from" relative_module "import" "(" identifier ["as" name]
                                    ( "," identifier ["as" name] )* [","] ")"
                                 | "from" module "import" "*"
module               ::= (identifier ".")* identifier
relative_module   ::= "."* module | "."+
name                 ::= identifier

    执行import语句时包括两个步骤:
(1) 找到模块,然后执行初始化
(2) 在局部名字空间中定义名称
不带"from"的import会对每个module重复上述两个步骤,带"from"的import只执行一次步骤(1),而对导进来的identifier重复执行步骤(2)。

    上面提到的初始化一个内建模块或扩展模块意思是,为了提供模块描述的功能去调用一个初始化函数(函数名一般是"init"+模块名);初始化一个Python所写的模块实际上就是执行模块的顶层代码(模块体)。
   
    系统维护着一个以模块名为索引的表,即sys.modules,里面的模块都是已经被初始化或者正在被初始化的。当在这张表里能够找到一个模块时,步骤(1)就完成了;如果没找到,就会开始搜索模块的定义。找到模块后就会装载模块。搜索和装载模块的详细过程和操作系统平台有关。通常先在内建模块里搜索,然后在sys.path给的路径列表里搜索。
   
    找到内建模块后执行它的初始化代码,步骤(1)就完成了。如果搜索不到匹配的文件,就会出现"ImportError"错误。如果搜索到了文件,分析文件,调用它的可执行代码块。如果分析文件时有语法错误,就会报"SyntaxError"。如果一切正常,就会创建一个给定名字的空模块,然后插入到系统的模块表中,步骤(1)完成。
   
    第一种形式的"import"语句在局部命名空间中绑定模块名到模块对象上,然后继续import下一个identifier。如果模块名后面跟的有as,就把as后的名称作为模块在局部命名空间中的名字。
   
    from形式的import不绑定模块名,它在步骤(1)找到的模块中查找每一个identifier,如果找到了就完成了在局部命名空间中的绑定。同样,如果有as,as后的名称会替换掉原来的名称绑定到局部命名空间中。如果没能找到identifier,就会报"ImportError"。如果identifier列表是用星号("*")代替的,则模块中定义的所有公有名称都会绑定到import语句的局部命名空间中。
   
    一个模块定义的公有名称是通过查找模块命名空间中的变量__all__来决定的。__all__变量是一个字符串列表,每个字符串必须是模块中定义的名称或是那个模块import进来的名称。__all__中的名称都被认为是公有的,当然也得存在[译者注:否则会出现"object has no attribute"错误]。如果__all__变量没有定义,公有名称包括模块的命名空间中找到的所有不以单下划线("_")打头的名称。__all__应该包含全部的公有API,使用它可以避免导出不是那个模块想要提供功能的API(如那个模块导入的一个库模块,但只在那个模块中用到,没有必要提供给外部的模块调用;[译者注:或者一个函数a只被函数b调用到,但只想提供函数b给外部使用])
   
    如果模块名包含一个或多个点("."),模块的搜索路径有所不同。最后一个"."之前的标识符序列用来寻找一个包("package");然后在包内寻找最后的identifier。[译者注:如a.b.c,则从当前目录查找看是否有目录a,再在目录a中查找是否有目录b,接着在目录b中查找c.py]。一个包通常是sys.path里一个目录的子目录,这个子目录里必须有一个名为__init__.py的文件。[译者注:__init__.py表明此目录应被作为一个package处理,__init__.py可以为空,也可以放置进入这个包时要运行的代码]。
   
    内建函数__import__可以用来动态地加载模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值