在Python中是否可以有类似于Smalltalk(例如Pharo)或Common Lisp的工作流?

2024-09-30 03:24:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我非常喜欢Smalltalk中的增量编程。你有一个正在运行的程序,当你充实你的程序时,你会添加它。您可以更改方法并使用应用的更改重新启动堆栈,以查看新版本的功能。当您的程序正在运行时,您可以检查本地状态并更改它们。在

在Python中有类似的功能吗?我看到过类似功能的提示,比如reload(),但是我对Python的了解还不足以理解它是如何使用的。我看过一些Python初学者的书,但没有看到任何关于这方面的内容。在


Tags: 方法程序功能版本内容堆栈状态编程
3条回答

不管对Python做什么努力,有些事情都是不可能的。例如,在开发web应用程序时,Flask/Django/Gunicorn或whatnot web服务器在源代码发生更改后必须重新启动其进程。但是在比如Lisp中,您在REPL中启动一个web服务器,然后您只需编译一个函数,例如添加一个新的路由,您就可以立即尝试它。没有进程重新启动,它更具交互性。在

另一个例子是更新类和实例。在公共Lisp中,假设您编写了一个类并创建了一些对象。现在您更改了类定义,并且现有实例得到(延迟)更新。例如,添加一个新的槽,删除一个槽,等等,我们甚至可以控制更新是如何完成的(通过子类化一些通用函数)。在

在Python中附加到一个正在运行的远程进程是可行的,但是交互性要少得多,编辑体验也不太理想(默认情况下,终端中是一个哑pythonshell,而完全成熟的Emacs则可以在一次击键(Slime中的C-c C-c)中导航源代码和重新编译函数(或者在任何其他可以连接到Swank服务器)。在

运行一个给定的单元测试也很简单和快速,不需要重新启动任何进程。在

参考文献:

您可以动态更改函数定义。在

例如,你有一个函数mymodule.myfunc(x,y),你想看看long_process()是如何调用它的。在

你可以(在REPL>>>提示符或笔记本中)

myfunc_orig = mymodule.myfunc
def myfunc_new(x,y):
    print("myfunc_new",x,y)
    return myfunc_orig(x,y)

mymodule.myfunc = myfunc_new

long_process()

现在每次调用mymodule.myfunc时都会得到一个打印输出。在

完成后,用

^{pr2}$

我在交互模式下使用ipython,或者在编程项目完成之前让终端保持打开状态,或者您可以通过dill保存会话(在ipython控制台do:!pip install dill)。在

使用dill包保存会话

要保存所有全局变量和定义,请执行以下操作:

import dill       
dill.dump_session('.session.pkl')

在新会话中可以通过以下方式加载:

^{pr2}$

它取自here

相关问题 更多 >

    热门问题