@eill

Тег python в блоге eill

eill
27 Nov 2016
eill

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

eill
11 Apr 2015
eill

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

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

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

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

eill
27 Feb 2015
eill

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

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

eill
27 Feb 2015
eill

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

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

eill
26 Feb 2015
eill

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

eill
13 Feb 2015
eill

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

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

eill
06 Feb 2015
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
11 Oct 2014
eill

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

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

eill
10 Oct 2014
eill

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

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

eill
21 Aug 2014
eill

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

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

eill
21 Aug 2014
eill

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

eill
07 Jul 2014
eill

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

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

eill
25 May 2014
eill

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

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

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

eill
23 May 2014
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
21 May 2014
eill

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

eill
20 May 2014
eill

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

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

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

eill
16 May 2014
eill

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

eill
11 May 2014
eill

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

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

eill
25 Apr 2014
eill

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

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

eill
20 Apr 2014
eill

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

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

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

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