Дизайн для основанного на продолжении фреймворка приложений Python
Существует множество основанных на продолжении фреймворков для Java, Ruby и т. Д., Но в Python их нет. Фреймворк Nagare несколько решает проблему, но он не использует стандартный Python и использует Python без стеков для решения проблемы продолжения.
Я размышлял,
Какая часть стандартного ограничения Python для создания такого продолжения веб-фреймворка в стандартном Python?
и какие обходные пути к этому? и каковы стандартные части в архитектуре структуры продолжения (как контроллер представления модели в MVC)?
2 ответа
Прежде чем вы даже начнете рассматривать написание среды, основанной на продолжениях, вам нужен язык программирования, который имеет продолжения (или, по крайней мере, сопрограммы, которые можно использовать для эмуляции продолжений). Продолжение - это управляющая структура, такая как циклы, замыкания или функции, а не шаблон проектирования, такой как MVC. К сожалению (в настоящее время) стандартный Python не поддерживает продолжения. Это одна из причин, по которой люди разработали Python без стеков.
Java - это особый случай. Сам язык не поддерживает продолжения, но виртуальная машина поддерживает (для поддержки исключений). Я думаю, что они сделали, чтобы изменить скомпилированный байт-код во время выполнения и изменить порядок команд, чтобы он выглядел так, как будто он поддерживает продолжения. Вроде как реализация Python без стека с помощью мартышки-патчинга.
Правильно, продолжение - это свойство языка, и у CPython, к сожалению, нет продолжений.
Обходные пути в чистом Python хорошо известны: используйте обратные вызовы / средства защиты, например, Twisted и Tornado, или везде используйте "yield" для имитации сопрограмм, таких как Diesel. Но оба подхода вынуждают вас изменить способ разработки и кодирования вашего приложения. Также продолжение может быть "воспроизведено", и именно таким образом рамки, основанные на продолжении, автоматически решают проблему с кнопкой "назад".
Наконец, если быть точным, в Нагаре мы используем травление замороженного тасклета для получения объекта продолжения.