9. 顶层组件¶
Python 解释器可以从多种来源获取输入:从作为标准输入或程序参数传递的脚本,以交互方式键入,从模块源文件等。本章给出了在这些情况下使用的语法。
9.1. 完整的 Python 程序¶
虽然语言规范不必规定如何调用语言解释器,但拥有一个完整 Python 程序的概念是很有用的。一个完整的 Python 程序在最低限度初始化的环境中执行:所有内置和标准模块都可用,但除了 sys
(各种系统服务)、builtins
(内置函数、异常和 None
)以及 __main__
之外,都没有被初始化。后者用于为完整程序的执行提供局部和全局命名空间。
完整 Python 程序的语法是用于文件输入的语法,将在下一节中描述。
解释器也可以在交互模式下调用;在这种情况下,它不会读取和执行一个完整的程序,而是每次读取并执行一条语句(可能是复合语句)。初始环境与完整程序的环境相同;每条语句都在 __main__
的命名空间中执行。
一个完整的程序可以通过三种形式传递给解释器:使用 -c
string 命令行选项,作为第一个命令行参数传递的文件,或作为标准输入。如果文件或标准输入是 tty 设备,解释器将进入交互模式;否则,它将把文件作为一个完整的程序来执行。
9.2. 文件输入¶
所有从非交互式文件读取的输入都具有相同的形式
file_input: (NEWLINE | statement
)* ENDMARKER
此语法用于以下情况
当解析一个完整的 Python 程序时(从文件或字符串);
当解析一个模块时;
当解析传递给
exec()
函数的字符串时;
9.3. 交互式输入¶
交互模式下的输入使用以下语法进行解析
interactive_input: [stmt_list
] NEWLINE |compound_stmt
NEWLINE | ENDMARKER
请注意,一个(顶层)复合语句在交互模式下必须后跟一个空行;这是为了帮助解析器检测输入的结束。
9.4. 表达式输入¶
eval()
用于表达式输入。它会忽略前导的空白。传递给 eval()
的字符串参数必须具有以下形式
eval_input: expression_list
NEWLINE* ENDMARKER