- 开胃菜
- 使用 Python 解释器
- 非正式介绍Python
- 深入流程控制
- 数据结构
- 模块
- 输入和输出
- 错误和异常
- 类
- 标准库的简明介绍
- 标准库的简明介绍(第二部分)
- 现在干什么?
- 交互式输入编辑及历史替代
- 浮点算术: 问题和限制
某些版本的 Python 解释器支持编辑当前输入行和历史替代, 就像 Korn shell 和 GNU Bash shell 一样. 这是通过 GNU Readline 库实现的, 它支持 Emacs 模式和 vi 模式. 这个库有它自己的文档, 所以在这里就不再说了; 但是基础的会简单的解释. 交互式的编辑及历史记录可能仅适用于 Unix, 及 Cygwin 版本上的解释器.
本章并*不*会讲 Mark Hammond 的 PythonWin 包或者是伴随 Python 一起发布, 基于 Tk 的IDLE. 而在 NT 平台下的命令行窗口或者是 DOS 这些 Windows 流派的东西, 也不会描述.
13.1. 行编辑
如果可以, 行编辑是一直激活的, 无论是处于第一或第二提示符. 当前行可以使用通用的 Emacs 控制符进行编辑. 最重要的几个: C-A
(Control-A) 移动光标至行首, C-E
移动至行尾, C-B
向左移动光标, C-F
向右. 退格键删除光标左边的一个字符, C-D
则删除右边的字符. C-K
删除光标右边剩余的所有字符, C-Y
则召回最后一次被删的字符串. C-underscore
取消最后一次的改变; 这可以重复的执行.
13.2. 历史替代
历史替换运行如下. 所有的非空输入行都会被保存于一个历史记录缓存, 当新的提示符给出时, 你处于这个缓存的最底部. C-P
可以向前翻一条记录, C-N
则向后翻一条. 任何的历史记录都是可以被编辑的; 如果被修改了, 那么会在提示符前增加一个星号. 按下 Return
(也就是回车) 将当前行传递给解释器. C-R
进行反向搜索; C-S
开始前向搜索.
13.3. 按键绑定
按键的绑定和 Readline 库其他的一些参数可以在 ~/.inputrc
中指明. 按键绑定的形式:key-name: function-name
或:”string”: function-name
选项可以这样设置:set option-name value
举个例子:# I prefer vi-style editing: set editing-mode vi # Edit using a single line: set horizontal-scroll-mode On # Rebind some keys: Meta-h: backward-kill-word “\C-u”: universal-argument “\C-x\C-r”: re-read-init-file
注意, 默认情况下 Tab
在 Python 中是用于插入一个 Tab
字符, 而非 Readline 默认的文件名补全函数. 如果你要用, 可以写入下面这行用于改写这个行为:Tab: complete
在你的 ~/.inputrc
中. (当然, 这样在缩进时就会有些麻烦.)
自动补全变量与模块名也是可选的. 为了开启这个模式, 将下面这段增加到你的启动文件中: [1]importrlcompleter, readline readline.parse_and_bind(‘tab: complete’)
这就将 Tab
键绑定了补全的功能, 所以按两次 Tab
键就会给你提示; 它会搜寻 Python 中语句的名字, 当前的局部变量, 和可用的模块名. 对于点号的表达式如 string.a
, 则会执行到最后的点号位置的语句, 然后给出这个对象的属性. 注意, 这会执行程序中定义的代码, 如果一个有 __getattr__()
方法的对象是表达式的一部分.
一个更聪明的启动文件可以是这样子的. 注意这个会删除它创建的但是不需要再用的名字; 从启动文件在同一命名空间执行后, 它就开始运行, 然后移除这些名字以避免对后面的交互环境产生副作用. 你会发现它对于用于保留某些导入的模块非常有用, 比如 os
, 这在多数会话中都会被大量使用.# Add auto-completion and a stored history file of commands to your Python# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is# bound to the Esc key by default (you can change it – see readline docs).## Store the file in ~/.pystartup, and set an environment variable to point# to it: “export PYTHONSTARTUP=/home/user/.pystartup” in bash.## Note that PYTHONSTARTUP does *not* expand “~”, so you have to put in the# full path to your home directory.importatexitimportosimportreadlineimportrlcompleter historyPath = os.path.expanduser(“~/.pyhistory”) def save_history(historyPath=historyPath): importreadline readline.write_history_file(historyPath) if os.path.exists(historyPath): readline.read_history_file(historyPath) atexit.register(save_history) del os, atexit, readline, rlcompleter, save_history, historyPath
13.4. 交互式解释器的替代品
相对于早期的解析器来说, 这是一个很大的进步; 但是, 有些愿望仍未实现: 如果在续行时有合适的缩进那么会很棒 (解析器会知道下面的缩进是否需要). 自动补全的机制可能使用解释器的符号表. 用于检查或建议匹配括号, 引号等的工具也会非常有用.
一个可选的增强型解释器应该算 IPython 了, 它有 tab 补全, 对象探索, 和更高级的历史管理功能. 它也可以被定制, 嵌入其他的应用. 另外一个则是 bpython.
Footnotes
[1] | 在你打开一个交互式解释器的时候, Python 会执行一个文件的内容, 这个文件由环境变量 PYTHONSTARTUP 指定. |