Андрей Светлов
Ноя. 17, 2010 16:05:57
Дочитал Defending Pyramid’s Design. Статья описывает, почему в Пирамиде сделали так или иначе определенные вещи.
Особенно доставило
http://docs.pylonshq.com/pyramid/dev/designdefense.html#microframeworks-have-smaller-hello-world-programsПодробно разбираются популярные грабли bottle и flask с разъяснением, почему никогда не стоит использовать такой дизайн.
Наглядно и доходчиво.
Рекомендую. Читать от ссылки и до конца файла.
Определенно, мне эти ребята нравятся все больше и больше.
regall
Ноя. 17, 2010 16:11:56
Андрей Светлов, сейчас им фактически удалось то, чего добивались bfg и grok =) - снизить порог вхождения в фреймворк, который базируется на ZCA, и скрыть эту самую ZCA для непосвященных =). Что здесь может не нравиться?
Андрей Светлов
Ноя. 17, 2010 16:24:07
ZCA - это понятно.
Я о другом.
1. Почему нельзя настраивать конфигурацию при импорте модуля?
2. Почему правила роутинга нужно писать в одном месте, не разбрасывая их по всему коду?
3. Почему глобальные переменные (даже весьма хитрые, с threadlocal) - зло? Этот пункт для совсем деревянных.
4. Отчего wsgi app должно быть именно приложением и не должно пытаться запустить весь wsgi stack с какими-то настройками по умолчанию?
По опыту знаю, первые два пункта особенно неочевидны.
Zubchick
Ноя. 17, 2010 16:46:14
А чем “микро” отличается от простого?
regall
Ноя. 17, 2010 16:52:10
Zubchick
А чем “микро” отличается от простого?
мне, на самом деле, сложно объяснить, но, походу, в понимании общественности - чем меньше в фрейморке “batteries included”, тем больше он “микро”. Как-то так …
Андрей Светлов
Ноя. 17, 2010 17:07:48
Есть еще одно забавное определение.
Микрофреймворки позволяют писать микропрограммы.
А микропрограмму можно вместить в один файл-модуль.
o7412369815963
Ноя. 17, 2010 17:50:35
Андрей Светлов
Подробно разбираются популярные грабли bottle и flask с разъяснением, почему никогда не стоит использовать такой дизайн.
Наглядно и доходчиво.
прочитал. я так понял что они говорят, что создание роутов через декораторы - плохо, т.к. они дублируются.
они не дублируются если запускать приложение правильно - нельзя импортировать запускаемый файл, т.е. если создать файл start.py:
from app import main
main()
то их “некорректный” пример работает корректно.
Андрей Светлов
Ноя. 17, 2010 19:55:53
Именно об этом и пишут. Чуть более жизненный пример.
Вот есть у вас два модуля со страничками и роутами к ним.
И есть приложение, которое импортирует оба модуля.
1. Порядок имеет значение - таблица роутов применяется последовательно, до первого совпадения.
2. Эти модули могут циклически импортировать друг друга. Это, конечно, неправильно.
Но в некоторых случаях (нет import .. from ..) питон ошибку не выдаст - а код модуля исполнится несколько раз.
А потом (может, и через месяц-другой) после очередного изменения все ломается.
Я такое видел на наших проектах. И, хоть и ни разу был не Веб - найти ошибку было нелегко.
Тоже обвешивали разными сомнительными декораторами.
Когда проект большой, это случается.
По хорошему за такое бьют по рукам - но мир не идеален.
В результате пришли к чему-то, напоминающему декораторы вьюшек в пирамиде. Декоратор только добавляет атрибуты - а конфигуратор уже потом их анализирует.
Так что и пример некорректный, и ситуация вполне жизненная.
Нечастая, да. Но каждый раз это отлична порция геморроя.
o7412369815963
Ноя. 17, 2010 21:47:06
т.е. получается это глюк питона, и сходу ошибку не сымитировать (наткнуться можно только случайно)?
Андрей Светлов
Ноя. 17, 2010 22:38:37
Это не глюк - просто фича.
Оборотная сторона очень мощной особенности - импортируемый код исполняется.
Фича проявляется, когда змеюку начинают бодро хватать за хвост.
До какого-то момента она терпит. А потом начинает кусаться.
Ошибку воссоздать довольно легко - но еще легче забыть о такой особенности.
Как я говорил, за подобный код бьют веником.
Плохой дизайн и т.д.
Программы часто бывают довольно сложными, и получается поймать неожиданности.
Лучше избегать их архитектурно.
При этом bottle и flask отлично работают, если весь код помещается именно в один файл.
Дальше нужно внимательно смотреть.