четверг, 19 августа 2010 г.

Python и mongodb: забрать значения из курсора

Очень полезной особенностью API Python для MongoDB (pymongo) является то, что мы всегда можем достать значения из ленивого курсора: для этого просто нужно использовать преобразование в list.

from pymongo import Connection

c = Connection()
db = c['database']
print db.users.find()
# выведет курсор MongoDB: 
print list(db.users.find())
# выведет список объектов из базы: [{u'username': u'user', u'visitor': False ... }, ...]

Python: произвольная строка

Часто возникает необходимость сгенерировать строку из случайных символов (например, для того, чтобы задать пароль). Язык Python позволяет сделать это быстро и элегантно:

import string
import random

def randstring(n):
    a = string.ascii_letters + string.digits
    return ''.join([random.choice(a) for i in range(n)])

print randstring(10)

Здесь мы создали и вывели на печать строку из 10 рандомных символов.

понедельник, 9 августа 2010 г.

(Ссылка) Python: конфликты метаклассов

Весьма неплохая статья о разрешении конфликтов метаклассов в Python.


JavaScript, jQuery: обертки

Когда-то можно было пользоваться такой функцией без всякого сомнения:


function $(id) { 
    return getElementById(id); 
}


Теперь же, когда многие используют библиотеку jQuery, объявление подобной функции может привести к неработоспособности другого кода, так как $ является синонимом для jQuery.

В таком случае можно либо явно указывать jQuery вместо знака доллара, либо прибегнуть к более изящному решению - оберткам:

Было:


function f(arg1, arg2) {

$('#some_selector')// ...

}

Стало:

function f(arg1,arg2) {
(function($) {
        $('#some_selector')// ... code
    })(jQuery)

}

Здесь мы создаем анонимную функцию и сразу же ее вызываем. Она представляет собой старую функцию с несколько измененной сигнатурой: в качестве параметра она получит jQuery, а "старые" аргументы будут доступны ей благодаря замыканиям.

суббота, 7 августа 2010 г.

Python: коварство рефакторинга (об удалении *.pyc файлов)

Python компилирует свои скрипты при первом запуске программы (точнее - при первом импорте из срипта, питон пытается сделать последующие обращения к скрипту чуть быстрее путем компиляции его в файл с расширением .pyc), потом он сначала ищет откомпилированный скрипт и только если его не находит - обращается к исходнику (.py).

Коварство рефакторинга (в частности, в среде разработки  PyCharm от JetBrains) заключается в том, что если вы переименовываете один из модулей (например, old_module -> new_module), то вам необходимо вручную прописать импорты в других модулях. Иначе может получиться довольно забавная ситуация: вы в новом модуле добавляете какой-то функционал, а программа при запуске импортирует .pyc файлы старого модуля, ни сколько не ругается и, разумеется, выполняет старый код.

Удалять старые компилированные файлы можно, например, такой командой:

find -type f -name '*.pyc' -exec rm {} \;