Возможно ли иметь такой же рабочий процесс в Python, как в Smalltalk (например, Pharo) или Common Lisp? - PullRequest
0 голосов
/ 18 декабря 2018

Мне очень нравится инкрементное программирование, которое я могу делать в Smalltalk.У вас есть работающая программа, и вы добавляете ее, когда конкретизируете свою программу.Вы можете изменить методы и перезапустить стек с примененными изменениями, чтобы увидеть, что делает новая версия.Пока ваша программа работает, вы можете проверять локальное состояние и изменять их.

Возможно ли нечто подобное в Python?Я видел намеки на такие способности, такие как reload (), но я недостаточно знаю Python, чтобы понять, как именно он используется.Я просмотрел некоторые книги для начинающих по Python, но я не увидел никаких упоминаний об этом.

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Я использую ipython для интерактивного режима - и либо оставляю терминал открытым до завершения проекта программирования, либо вы можете сохранить сеанс на укропе (в консоли ipython выполните: !pip install dill).

сохранить сессию, используя пакет укропов

Чтобы сохранить все глобальные переменные и определения, выполните:

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

Который в новом сеансе можно загрузить с помощью:

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

Взято из здесь

0 голосов
/ 20 декабря 2018

Некоторые вещи не будут возможны, независимо от того, какие усилия приложены к Python.Например, при разработке веб-приложения веб-сервер Flask / Django / Gunicorn или whatnot должен перезапустить свой процесс после изменения в источниках.Но, скажем, на Lisp, вы запускаете веб-сервер в REPL, и вы просто компилируете функцию, которая, например, добавляет новый маршрут, и вы можете попробовать его сразу же.Ни один процесс не был перезапущен, он стал более интерактивным.

Другой пример - обновление классов и экземпляров.Предположим, в Common Lisp вы написали класс и создали несколько объектов.Теперь вы меняете определение класса, и существующие экземпляры обновляются (лениво).Например, добавляется новый слот, один удаляется и т. Д. И мы даже можем контролировать, как выполняется обновление (путем подкласса некоторых общих функций).

Подключение к запущенному и удаленному процессу в Python возможно, но интерактивность намного меньше, и опыт редактирования также менее идеален (тупая оболочка python в терминале по умолчанию против полноценного Emacs, где вы можете перемещаться по источникам и перекомпилировать функции одним нажатием клавиши (C-c C-c вSlime) (или в любом другом редакторе, который может подключаться к серверу Swank)).

Выполнение одного данного модульного теста также просто и быстро, процесс перезапуска отсутствует.

Ссылки:

0 голосов
/ 18 декабря 2018

Вы можете изменить определения функций на лету.

Например, у вас есть функция 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.

Когда вы закончите, вы восстановите ее с помощью

mymodule.myfunc = myfunc_orig
...