Показаны сообщения с ярлыком libraries. Показать все сообщения
Показаны сообщения с ярлыком libraries. Показать все сообщения

24 июля 2012 г.

argparse, format и six или мои маленькие радости

Скажем прямо, optparse был хорошим решением для Python 2.3, когда в нем была только обертка над getopt. Но время шло и народ требовал нового решения, составлял PEP'ы и наконец принимал argparse в состав Python 2.7+. Однако на argparse я пересаживался долго. Вот прошло уже больше года с моего окончательного перехода на 2.7 ветку, а я все пытался парсить опции и аргументы, приходящие в Python-скрипт, при помощи optparse. Последние пару недель меня убедили что очень зря! С argparse я теперь могу разбирать не только опции, но и аргументы. Никакого больше,

parser = OptionParser(...)
...
options, args = parser.parse_args()

только,

parser = ArgumentParser(...)
...
args = parser.parse_args()

только так! В целом преимущества нового подхода над старым расписаны в документации и в паре других статей. Так что не буду повторятся, просто посоветую и вам использовать argparse и забить на optparse as soon as possible.


Примерно похожая на ситуацию с optparse, у меня была ситуация с форматированием строк. Я продолжал грызть кактус использовать синтаксис 'Hello, %s!' % 'world' вместо модного и молодежного 'Hello, {0}!'.format('world'). И опять же пару последних недель расставили все по местам. После окончательного ознакомления со всеми возможностями Format String Syntax, я просто понял, что назад дороги нет! Только format, только так!

И да, ведь встроенная функция format может использоваться не только для форматирования строк, но и для любых других объектов, которые поддерживают метод __format__. Например, сейчас нет необходимости пользоваться strftime для объектов из библиотеки datetime, просто пишем,

format(datetime.date.today(), '%Y-%m-%d')

или даже,

'{:%Y-%m-%d}'.format(datetime.date.today())

и вуаля!


А напоследок скажу, что также в последнее время часто задумываюсь о необходимости изучения Python 3 или хотя бы портирования какого-то своего кода на эту ветку. И как по магии, в своем фиде на GitHub нашел полезную библиотеку six, которая весьма мне пригодится в этом деле. Вот такие вот дела!

25 ноября 2010 г.

Форматируем datetime.timedelta в что-то человеко-читаемое

Оговорюсь сразу, тем кому за глаза хватает print(datetime.timedelta(seconds=99660)) для форматирования и понимания содержимого datetime.timedelta могут смело не читать дальше.

Мне же приходится работать с datetime.timedelta очень часто и потому меня совершенно не устраивали встроенные возможности форматирования дельт. Чего мне не хватало больше всего так это вывода дельты в формате "G:i", говоря языком встроенного шаблонного фильтра date, т.е. показать общее кол-во часов и кол-во минут (не всех, а только остатка) для дельты. Именно для удовлетворения этих нужд я начал писать связку функций str_to_timedelta / timedelta_to_str, которые пару часов назад приняли окончательный вид.

Как они работают? Очень просто,

>>> import datetime
>>> from kikola.utils import str_to_timedelta, timedelta_to_str
>>> delta = datetime.timedelta(seconds=99660)
>>> timedelta_to_str(delta)
... u'27:41'
>>> timedelta_to_str(delta, 'd l, h:i:s')
... u'1 day, 03:41:00'
>>> timedelta_to_str(delta, 'f')
... u'1d 3:41'
>>> timedelta_to_str(delta, 'F')
... u'1 day, 3:41'
>>> timedelta_to_str(delta, 'S')
... u'99660'
>>> str_to_timedelta('27:41') == delta
... True
>>> timedelta_to_str('1 day, 03:41:00', 'd l, h:i:s') == delta
... True
>>> str_to_timedelta('1d 3:41') == delta
... True
>>> str_to_timedelta('1 day, 3:41') == delta
... True
>>> str_to_timedelta('99660', 'S') == delta
... True

Как видите, все действительно просто. Плюс к тому, если вам нужно использовать эти функции в шаблонах, вы можете воспользоваться фильтром timedelta из шаблонной библиотеки timedelta_tags.

{% load timedelta_tags %}
{{ delta|timedelta:"G:i:s" }}

Весь этот код довольно успешно живет в моем проекте kikola, полностью покрыт тестами и работает с Django 1.0+. Чтобы окончательно не углубляться, скажу только, что вы можете посмотреть все доступные форматы для форматирования в комментариях к timedelta_to_str, а также при частом использовании формата, отличного от дефолтного "G:i" вы можете указать его в TIMEDELTA_FORMAT переменной в настройках проекта, и затем str_to_timedelta и timedelta_to_str будут использовать указанный формат, как формат по умолчанию.

29 апреля 2009 г.

Надо причесать SQL для дебага? Просто!

Ведь у нас есть python-sqlparse. Он быстро и безболезнено превратит конструкции вида:

select * from foo join bar on foo.val = bar.val where foo.id = 123;

в удобно-читаемую, человеко-понятную форму:

SELECT *
FROM foo
JOIN bar ON foo.val = bar.val
WHERE foo.id = 123;

Спасибо, Simon Willison за ссылку.

БОНУС: Не хотите устанавливать python-sqlparse на свою машину или надо постоянный доступ к форматированию sql-запросов? Запросто! Сохраняйте в закладки Online SQL formatting service и будет вам счастье!

23 февраля 2009 г.

jQuery + Python = ?

pyquery

Библиотека pyquery позволяет использовать синтаксис jQuery при выборке элементов с XML или HTML строк в Питоне. Так же эта библиотека содержит и другие функции из базового функционала jQuery, например,

$('head').append('<body></body>')

в pyquery будет эквивалентно вызову:

from pyquery import PyQuery doc = PyQuery(filename='/path/to/file.html') doc('head').append('<body></body>')

Больше о библиотеке pyqeury вы можете найти на ее странице в PyPI или на ее оффициальном сайте.

jsjquery

А вот это библиотека несколько другого коленкора. Она позволяет устанавливать библиотеку jQuery в систему и проверять ее наличие в своих проэктах.

А вы знаете как еще связаны между собой Python и jQuery?