Joh*_*den 5 python pylons read-eval-print-loop
我正在使用预先存在的pylons项目(okfn的ckan)在python中编程,但我是一个贸易上的lisper并习惯于这种做事方式.
如果我做出虚假陈述,请纠正我:
在挂架中,似乎我应该说
$ paster serve --reload
获得一个会注意到变化的Web服务器.
此时我可以更改功能,保存文件,然后转到浏览器测试更改.
如果我想在制作网页的过程中检查函数中的变量,那么我将加注"hello",然后当我加载页面时,我得到一个基于浏览器的调试器,我可以在其中检查程序.
这一切都非常好并且在游泳方面起作用,我得到的印象是人们倾向于编写挂架代码.
不幸的是,重新加载需要几秒钟,并且它不断打破我的思路.
我想做的是从emacs运行Web服务器,(虽然命令行上的python REPL几乎一样好),这样我就可以在编辑器中更改一个函数,然后将新代码发送到运行过程而不必重新启动它.(使用命令行repl我想我必须复制并粘贴新的东西,但这也是可行的,只是稍微不方便)
Python看起来非常有活力,而且在许多方面都非常像lisp,所以我原则上看不出任何原因导致它无效.
所以我想问题是:
是否有人熟悉lisp的做事方式,以及Pylons,他们能告诉我如何在pylons中编写lisp方式吗?或者出于某种原因这是不可能的还是坏的?
编辑:
我可以从emacs里面的python解释器运行webserver:
from paste.script.serve import ServeCommand
ServeCommand("serve").run(["development.ini"])
Run Code Online (Sandbox Code Playgroud)
我可以通过插入代码来停止并向我展示它正在做什么:
import pdb
pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
所以我现在只需要一种方法让网络服务器在不同的线程上运行,这样控制就可以返回到REPL,我可以在运行过程中重新定义函数和变量.
def start_server():
from paste.script.serve import ServeCommand
ServeCommand("serve").run(["development.ini"])
server_thread=threading.Thread(target=start_server)
server_thread.start()
Run Code Online (Sandbox Code Playgroud)
这似乎有效,除了如果我在REPL重新定义一个函数,更改不会反映在Web服务器中.有谁知道为什么?
由于 TokenMacGuy 的评论给出的原因,这种工作方式在 python 中似乎是不可能的,即因为重新定义类不会更改该类实例中的代码。
这似乎是一个可怕的耻辱,因为在许多其他方面 python 看起来非常灵活,但它确实解释了为什么没有 python-swank!