@eill

Тег python в блоге eill

eill

ipython 5 - второтег. Жутко неудобный автокомплит, показывающий "няшную" менюшку вместо всех потрохов класса. И это ёбаное говно не отключается. Неновесть.

eill

посоны, есть код, у которого задача - принять на вход массив вида [1,2,3,5,6,7,9,11,12,13,14] и выдать на-гора нечто вида [[1,3], [5,7], [9], [11,14]]. В итеративном стиле решил довольно быстро, но мне не нравится, как оно выглядит (т.е. оно работает, но некрасиво).

Если начинаю расписывать на генераторах, то получается поебень на полстраницы, в конечном итоге реализующая итеративный алгоритм, но через жопу.

Куда имеет смысл начать копать, чтобы это реализовать?

итеративный код есть на http://ideone.com/eAGKOj

eill

за полгода активного кодинга башка капитально переформатировалась с Perl на Python, причём не столько по части синтаксиса, сколько по части логики разработки и используемых инструментов.

писать без REPL дико неудобно, отсутствие help(module) удручает, как я раньше без всего этого жил?

eill

а посоветуйте, чем делать push клиенту на стороне веба?

хочу отдавать клиенту пустую страничку, а потом, исходя из событий на коллбеках наполнять её данными. Посоветуйте, куда ковырять? Названия технологии, овощи, рожь вот это всё.

eill

до сих пор испытываю некое благоговение, щтоле, когда получается заковыристо решить сложную задачу one-liner'ом или какой-нибудь крутой генератор с reduce написать. Забавное ощущение.

eill

зырьте, какое говно у меня получилось, если следовать всем правилам pep8: http://pastebin.com/qiLYDKQk

как это правильно выровнять и отформатировать? Даже и не знаю.

eill

расскажу поподробнее, как и зачем пришлось залезать в отладчик. Почти наверняка я уверен, что надо было всего лишь посмотреть документацию по алембику, но на момент появления задачи мне это было неочевидно.

дано: пишем морду для почтового сервера. Цель тривиальна - управление доменами и пользователями в них. Используем flask и 4-5 функций внутри, задача на один вечер. Схема есть заранее, модель строится под неё. Необходимо засунуть схему в скрипт миграции, чтобы можно было безболезненно как крутить базу в продакшене, так и разрабатывать управлялку на ноуте, используя sqlite (а больше там не надо).

проблема: в модели есть вьюхи, которые используются собственно почтовым сервером. ORM они не нужны, поэтому их нужно просто создать командой op.execute в скрипте миграции алембика. Всё бы хорошо, но, к сожалению, в определении одного из столбцов используется функция concat (ею формируется user-friendly видимый e-mail из login, '@' и domain); данной функции в sqlite нет, вместо неё рекомендуется использовать конструкцию вида login || '@' || domain.

задача: определить, как из скрипта миграции получить имя текущего используемого диалекта БД.

решение: python -m pdb ./manage.py db upgrade, брейкпоинт на строчке op.execute, continue до неё, открытие repl и исследование при помощи dir внутренностей объекта op (это alembic). Выяснилось, что из алембика можно получить текущий session при помощи функции get_bind, а из объекта сессии получить имя используемого драйвера - тривиальность. Дальше мы просто пишем в скрипте миграции if op.get_bind().dialect.driver == 'pysqlite': и уже выполняем диалектоспецифичный код.

вывод: pdb - действительно хорошая и удобная штука. Зря я его раньше не использовал :)

З.Ы. я прекрасно понимаю, что расписываю элементарные для любого программиста вещи, но тем не менее лучше я это сделаю - вдруг и в самом деле кому-то это пригодится :)

eill

а есть вот например неплохая книжка по фласку, там разбирается пример программы-микроблога. Так вот, там достаточно большая часть логики (например, "зафолловить такого-то юзера") вынесена в модель, в класс самого этого юзера.

это зашквар или красиво? Никак не могу определиться.

eill

норот, а уместно вообще использовать всякие dict для поиска функций в модуле или за это, как правило, бьют?

Приведу пример: есть функция, реализующая snmp set. Принимает на вход три аргумента, oid, value и value_type (последний - необязательный, если его нет, она пытается определить тип по содержимому). Однако, если мы этот тип всё-таки указываем, то я пытаюсь сделать pysnmp.proto.rfc1902.dictvalue_type, т.е. по сути вызвать функцию по её имени. Скажите, это коряво или так делают? И если коряво (а коряво, я сам чувствую), то как лучше переделать?

eill

народ, а выносить объекты модели в шаблон - это зашквар или вполне нормальная практика?

и есть ли ещё варианты, кроме формирования структуры с данными и передачей её в шаблонизатор?

eill

вытащил часть логики в шаблон. Чувствую себя долбоебом. Надо переделать.

eill

в который раз пришлось практически с нуля (ну ладно, процентов 40) переписывать модель, потому что вскрылись некоторые детали.

осталось только допилить отношение m:n у сущности к самой себе в sqlalchemy, написать первичный скрипт генерации для алембика и, наконец-то, можно будет начинать клепать круды. Поскорее бы уже.

eill

во втором теге совершенно отвратительно реализовано сосуществование нескольких версий питона.

по каким-то левым хаутушкам пришлось реализовывать возможность uwsgi запускать приложения и на второй, и на третьей версии python.

реализовал, но неприятный осадок остался.

eill

дана строка, надо разобрать. В python@ предложили сделать на регекспах.
s = 'Работы (1) | Соавтор (2) | Бета (редактор) (3) | Заявки (4) | Сборники (5) | Оставленные отзывы (6)'

решение при помощи re:
re.findall(r'(.*?) ((\d+))(?: \| )?', s)

=> [('Работы', '1'), ('Соавтор', '2'), ('Бета (редактор)', '3'), ('Заявки', '4'), ('Сборники', '5'), ('Оставленные отзывы', '6')]

но мы крутые, надо сделать без них:
In[43]: [(functools.reduce(lambda x,y: x+' '+y if y.strip('(1234567890)') else x, x.split(' ')), x.split(' ')[-1:][0].strip('()')) for x in s.split(' | ')]
Out[43]:
[('Работы', '1'),
('Соавтор', '2'),
('Бета (редактор)', '3'),
('Заявки', '4'),
('Сборники', '5'),
('Оставленные отзывы', '6')]

и непонятно, то ли я долбоёб, то ли одно из трёх. В любом случае, регекспы тут как-то полущ выглядят :)

eill

tfw начинаешь проект, рисуешь ER-схему и за полчаса накидываешь рабочий каркас приложения. Блядь, почему я раньше этого не умел? Я дебил :(

eill

народ, а как вы pyvenv с git интегрируете? У меня тут засада: pyvenv для создания требует пустой каталог, равно как и git для clone.

схема сейчас такая: для нового проекта на удалённом сервере делается git init --bare, потом клонируется уже ко мне для работы. В тот же каталог делается pyvenv, но с матюками и воплями о том, что каталог уже не пустой. git clone в непустой каталог вообще не отрабатывает :)

подходящий .gitignore для исключения из проекта всякого pyvenv'овского говна какбе уже есть, но вот вопрос: правильно ли я делаю, что инициализирую pyvenv в калоге проекта, или всё-таки для этих целей лучше делать отдельную подпомоечку?

eill

tfw когда уже больше полугода не пишешь на второтеге, но всё равно для того, чтобы из структуры данных сделать конфиг пишешь однострочник. И это быстрее, чем запихивать это в специализированный парсер.

eill

снёс всё говно, что натворил при помощи pip, снёс весь python вообще, ставлю всё с нуля.

теперь кастомные недистрибутивные модули только в virtualenv.

eill

странное ощущение, когда пишешь какой-нибудь заковыристый генератор, а он работает так, как надо с первого раза.

с одной стороны клёво, что получается, а с другой стороны чувствуешь себя говном, потому что не умел этих простейших вещей раньше.

eill

поехал в командировку, хорошо подготовился, скачал мануалов и за 4 часа езды в поезде написал файлопомойку на первотеге с фласком. Залил в облако - работает. После первого коммита-пуша. Waah.

применил пару приёмов, раньше не применённых (мною, быдлом). Надо больше кодить, похоже, чем больше практики, тем легче это идёт.

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.