9. 顶级组件

Python编译器能从多种渠道获取输入:脚本的输入或参数,交互式输入,以及模块化源文件等本章给出这些情况下使用的语法。

9.1. 完整的Python程序

虽然语言的规范不需要规定语言的解释器如何被调用,但是对完整的 Python 程序有一个概念是很有用的。一个完整的Python程序在最小初始化环境中执行:所有内置的模块都可以访问,但是除了sys(各种系统服务),builtins(内置函数,异常和None)和__ main __之外,都没有初始化。后者用来给完整的程序的执行提供局部和全局命名空间。

完整的Python 程序的语法用于文件输入,在下面的小节中讲述。

解释器也可以在交互模式下调用;在这种情况下,它不会读取和执行完整的程序,而是一次读取并执行一个语句(可能是复合语句)。初始环境与完整程序的环境相同;每个语句在__ main __的命名空间中执行。

在Unix下,完整的程序可以以三种形式传递给解释器:使用-c string命令行选项,作为命令行第一个参数传递的文件,或作为标准输入。如果文件或标准输入是tty设备,解释器进入交互模式;否则,它将作为完整程序执行该文件。

9.2. 文件输入

所有从非交互式文件读取的输入都具有相同的形式:

file_input ::=  (NEWLINE | statement)*

该语法用在以下的情形:

  • 当解析一个完整的Python 程序(从一个文件或者一个字符串);
  • 当解析一个模块;
  • 当解析传递给exec()函数的字符串时;

9.3. 交互输入

交互模式下的输入使用下面的语法解析:

interactive_input ::=  [stmt_list] NEWLINE | compound_stmt NEWLINE

注意,(顶级)复合语句必须在交互式模式中后跟空行;需要它帮助解析器检测输入的结束。

9.4. 表达式输入

eval()用于表达式输入。它忽略前导空白。eval()的字符串参数必须具有以下形式:

eval_input ::=  expression_list NEWLINE*