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

Python中是否可能有与Smalltalk(例如Pharo)或Common Lisp中类似的工作流?,python,debugging,smalltalk,pharo,Python,Debugging,Smalltalk,Pharo,我非常喜欢Smalltalk中的增量编程。你有一个正在运行的程序,当你充实你的程序时,你会把它添加进去。您可以更改方法并使用应用的更改重新启动堆栈,以查看新版本的功能。程序运行时,您可以检查本地状态并更改它们 类似的东西在Python中可能吗?我已经看到了这类功能的提示,比如reload(),但我对Python的了解还不够,无法确切理解它是如何使用的。我已经看过一些Python初学者的书,但我没有看到任何提到这一点 您可以动态更改函数定义 例如,您有一个函数mymodule.myfunc(x,y

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


类似的东西在Python中可能吗?我已经看到了这类功能的提示,比如reload(),但我对Python的了解还不够,无法确切理解它是如何使用的。我已经看过一些Python初学者的书,但我没有看到任何提到这一点

您可以动态更改函数定义

例如,您有一个函数
mymodule.myfunc(x,y)
,您想看看
long\u process()如何调用它

您可以这样做(在REPL
>
提示符下或在笔记本中)

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

完成后,您可以使用

mymodule.myfunc = myfunc_orig

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

使用dill软件包保存会话

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

import dill       
dill.dump_session('.session.pkl')
在新会话中,您可以通过以下方式加载:

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

它来自于

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

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

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

运行一个给定的单元测试也是简单和快速的,没有过程可以重新启动

参考资料:

  • 在另一台计算机上调试正在运行的程序:

内置方法
exec(源代码、全局、局部)
接受“全局”和“局部”参数。 它们非常接近smalltalk的执行“环境”或“执行映像”

exec(..)
call返回时,声明的类/函数/变量被添加到全局/局部变量中

全局/局部可以轻松地存储到文件中,并用作将来执行的启动环境:)

模拟smalltalk的“基于图像的”

我想这个技巧可以重现smalltalk执行环境的属性,是真的吗

例如:

locals,globals={},{}
exec(““”def(x):返回x+1”“”,全局变量,局部变量)
印刷(本地[“f”](2))
exec(““”def(x):返回x+10”“,全局,局部)
印刷(本地[“f”](2))

您的意思是在交互式解释器中运行它吗?或者使用
重新加载
功能重新加载模块?这两个选项都可以实现您想要的功能。虽然考虑到Python的解释速度和合理的速度,但通常更容易重新启动整个应用程序,而不是在运行时修改代码。我认为您描述的许多功能都是由于Smalltalk是“基于图像的”。在这个问题的答案中有一些提示:。我很想知道你问题的答案。我会区分可能的和自然的。Smalltalk中的程序是环境/映像的扩展,而不是用它构建的产品。这就是为什么这些特性是自然的,而不仅仅是可能的。虽然它与Python无关,但我注意到,Flatter mobile开发平台的主要特性是“有状态热加载”,其语言(Dart)对它的友好程度不如这些。所以,这只是一个做到自然的问题。
import dill
dill.load_session('.session.pkl')