如何在Python shell中每次按下回车键时运行一个函数

4

我有时会在交互式shell中编写小函数。

它们很少一次就正确,所以我花费了很多时间在相同的测试集上运行我的函数的版本来验证正确性。

>>> def test_foo():
        print( foo(4) == 5 )
        print( foo(8) == 9 )
>>> def foo(x): return x + 1
>>> test_foo()
True
True

但是foo可能更加复杂,我可能需要进行5次或更多次的改写才能通过测试。手动运行测试套件很无聊,因此我需要像这样的东西:

>>> def test_foo():
        print( foo(4) == 5 )
        print( foo(8) == 9 )
>>> :SET_ON_EXECUTION test_foo

现在每次我重写我的foo函数并将其发送到定义,测试也将运行。

一些研究

  • 搜索Google没有得到有用的答案。
  • 在shell中,python -h没有告诉我如何做这件事。
  • %quickref'ipython也不是。

您介意按几次向上箭头,或者按Control-R后再按几个字符,然后按Tab和Enter吗? - user707650
或者你可以快速地将 f = test_foo 赋值,这样可以节省大约8个字符。现在你只需要在提示符下输入 f() 即可。 - user707650
@Evert,那就是我目前正在做的事情,自动化会非常好。 - Caridorc
Jupyter(Web)笔记本中的单元格只需要按下Alt + Enter即可执行当前单元格。编辑单元格,按下Alt + Enter,再次编辑,再按下Alt + Enter等。这是我能想到的最接近的方法。可能有一些集成开发环境也有类似的行为。 - user707650
3个回答

3
我强烈建议使用Jupyter笔记本(以前称为IPython)来完成此任务。它允许您创建包含代码的“单元格”,并可以使用Ctrl-Enter组合键重新执行它。例如,在您的情况下,您可以将函数定义和执行放在同一个单元格中,然后在编辑时轻松地重新执行它。

Jupyter notebook interface

通过逐步构建代码,一次修复和开发一个函数,您可以逐渐构建自己的代码。
由于您已经安装了IPython,因此您应该能够使用以下命令开始运行:
$ pip install jupyter
$ jupyter notebook

它将在您的浏览器中启动。通过在右上角点击“新建”并在“笔记本”下选择一个Python内核来创建新的笔记本。

3

请问您能否给一些更具体的提示?您是指将屏幕分成两半,将代码放在一个文件中,测试放在另一个文件中吗?这不是和doctest类似,只是不太用户友好吗? - Caridorc
我的意思是在屏幕上同时打开编辑器和终端。在编辑器中,您将编辑代码或测试。在终端中,您将设置一个文件监视器,每当测试文件或代码文件更改时运行您的测试。 您使用的是什么操作系统?每个操作系统都有自己的文件监视技术。 - Hubert Grzeskowiak
有趣的是,我使用Ubuntu 15.04。 - Caridorc

2
由于您正在使用ipython,因此您可以创建一个名为whatever.py的文件,其中包含您想要在启动时运行的代码,然后通过ipython whatever.py运行ipython
您还可以通过修改~/.ipython/ipy_user_conf.py来运行Python代码:

您的~/.ipython目录中应该有一个简单的模板ipy_user_conf.py文件。它是一个普通的python模块,在IPython启动期间导入,因此您几乎可以在那里做任何想做的事情 - 导入模块、配置扩展、更改选项、定义魔术命令、将变量和函数放在IPython命名空间中等等。您可以使用IPython扩展API对象(通过IPython.ipapi.get()获取并在“IPython扩展API”章节中记录)与IPython交互。

您还可以在当前工作目录中放置一个名为ipythonrc的文件:
正如我们已经提到的,IPython会读取一个配置文件,该文件可以在命令行上指定(-rcfile),或默认情况下假定为ipythonrc。这样的文件首先在启动IPython的当前目录中查找,然后在您的IPYTHONDIR中查找,这允许您为特定项目拥有本地配置文件。在本节中,我们将简称这些类型的配置文件为rcfiles(资源配置文件)。 execute:提供任何单行Python代码以执行。 execfile:使用execfile(filename)命令执行给定的Python文件。用户名扩展将对给定名称执行。因此,如果您需要任何额外的高级自定义选项,无法适应上述任何“预设”选项,您可以将其放在单独的Python文件中并执行它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接