2

我有时会在开发 Python 模块时通过在终端中运行 Python 交互式提示、导入我的新模块并测试其功能来测试它们。当然,由于我的代码正在开发中,因此存在错误,并且需要经常重新启动解释器。当我在重新启动之前只执行了几行解释器时,这并不太痛苦:当解释器重新启动时我的键序列看起来像Up Up Enter Up Up Enter......但是将其推断为要重复的 5 个或更多语句,它会变得非常痛苦!

当然,我可以将我的测试代码放入我执行的脚本中python -i,但这是一个临时活动,以至于打开文本编辑器似乎不太“超过阈值”:) 我真正渴望的是Ctrl-r来自 bash shell 的行为:在 bash 中按顺序执行 10 个命令的序列涉及在历史记录中查找命令(重复UpCtrl-r搜索——两者都在 Python 解释器 shell 中工作),然后只需按Ctrl-o十次。我最喜欢的 bash shell 功能之一。

问题是,虽然许多其他 readline 绑定功能(如Ctrl-aCtrl-eCtrl-rCtrl-s在 Python 解释器中工作)Ctrl-o却没有。我无法在网上找到对此的任何引用,尽管也许readline模块可用于将此功能添加到python提示中。有什么建议么?

编辑:是的,我知道使用交互式解释器不是一种超出几行的开发方法!但是对于小测试来说很方便,IMO 的交互性可以帮助判断一个开发的 API 是自然方便还是过于繁重。因此,请限制对 readline 历史步进是否可以在 python 中工作的技术问题的答案,而不是关于是否应该或不应该选择(有时)以这种方式工作的侧面意见!

编辑:自从发布以来,我意识到我已经在使用该readline模块来使一些 Python 解释器历史功能工作。operate-and-get-next但是似乎不支持Ctrl-o 绑定到readline 命令,即使我放入readline.parse_and_bind("Control-o: operate-and-get-next")了我的PYTHONSTARTUP文件。

4

4 回答 4

4

在开发 Python 模块时,我经常通过在终端中运行 Python 交互式提示、导入我的新模块并测试功能来测试它们。

停止使用这种模式并开始在文件中编写测试代码,您的生活会轻松很多。

  • 无论如何,运行该文件会少一些麻烦。

  • 如果您使检查自动进行而不是读取结果,那么检查您的代码会更快,更不容易出错。

  • 您可以在完成后保存该文件,并在更改代码或环境时运行它。

  • 您可以对测试执行指标,例如确保您没有未测试的代码部分。

你熟悉unittest 模块吗?

于 2012-10-05T12:14:37.673 回答
1

在对 python-ideas 列表进行一些讨论之后回答我自己的问题:尽管一些 readline 文档中的信息相互矛盾,但似乎该operate-and-get-next函数实际上被定义为 readline 的 bash 扩展,而不是核心 readline。

所以这就是为什么在 Python 解释器会话中Ctrl-o导入模块时默认情况下都没有表现出预期的行为readline,也没有尝试手动强制此绑定:该函数在要绑定的 readline 库中不存在。

谷歌搜索显示https://bugs.launchpad.net/ipython/+bug/382638,GNU readline 维护者在其上给出了将此功能添加到核心 readline 的原因,并说它应该由调用应用程序实现。他还说“它的实现并不复杂”,尽管对我来说如何(甚至是否可能)将其作为readline模块行为的纯 Python 扩展并不明显。

所以不,目前这是不可能的,除非operate-and-get-next来自 bash 的函数在 Pythonreadline模块或解释器本身中显式实现。

于 2012-10-08T13:15:30.037 回答
0

这不完全是您问题的答案,但如果这是您的开发风格,您可能想看看DreamPie。它是 Python 终端的 GUI 包装器,提供各种方便的快捷方式。其中之一是能够在解释器显示中拖动选择并仅复制代码(而不是输出)。然后,您可以粘贴此代码并再次运行它。我发现这对于您描述的工作流程类型很方便。

于 2012-10-07T21:42:22.657 回答
0

你最好的选择是检查那个项目:http: //ipython.org

这是一个使用Ctrl+进行历史搜索的示例R

在此处输入图像描述

编辑 如果您正在运行debian或派生:

sudo apt-get install ipython
于 2012-10-07T22:07:31.030 回答