9. 顶层组件

Python 解释器可以从多个来源获取输入:作为标准输入或程序参数传递给它的脚本,交互式输入,模块源文件等。本章介绍了这些情况下使用的语法。

9.1. 完整的 Python 程序

虽然语言规范不需要规定语言解释器的调用方式,但了解完整的 Python 程序的概念很有用。完整的 Python 程序在最小初始化的环境中执行:所有内置和标准模块都可用,但除了 sys(各种系统服务)、builtins(内置函数、异常和 None)和 __main__ 外,没有初始化。后者用于为完整程序的执行提供本地和全局命名空间。

完整的 Python 程序的语法与下一节中描述的文件输入的语法相同。

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

完整的程序可以通过三种形式传递给解释器:使用 -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*