Posts Tagged ‘python’

Django: pluralize

Naj­waż­niej­szą rze­czą, jaką powin­ni­ście wie­dzieć na temat fil­tra plu­ra­lize jest ta, żeby go nigdy nie uży­wać. Nigdy. Jego ist­nie­nie wynika z leni­stwa ludzi, któ­rzy nigdy w życiu nie przy­go­to­wy­wali apli­ka­cji do tłu­ma­cze­nia. Jeśli nie wyra­zi­łem się dość jasno, uży­wa­nie fil­tra plu­ra­lize wywoła u cie­bie raka, ste­reo­po­roże i zatwar­dze­nie roz­siane.
Jak­kol­wiek spryt­nie by nie wyglą­dał, ten kod […]

Python: alternatywa dla dict.update

Kolejny skrót. Dość regu­larny przy­pa­dek zwró­ce­nia sumy słow­ni­ków bez nisz­cze­nia któ­re­go­kol­wiek z nich:

def foo(bar, baz):
tmp­dict = dict(bar)
tmpdict.update(baz)
return tmpdict

Można rów­nież roz­wią­zać ina­czej, korzy­sta­jąc z faktu, że dict akcep­tuje nazwane parametry:

def foo(bar, baz):
return dict(bar, **baz)

Korzy­sta­jąc ze skró­tów zawsze upew­nij się, że na […]

Django: direct_to_template

Nie wiem, czemu nie­któ­rzy tak upar­cie korzy­stają z funk­cji render_to_response, by za każ­dym razem prze­ka­zać do niej ręcz­nie stwo­rzony obiekt kon­tek­stu. Zresztą, sami oceń­cie, która wer­sja jest ładniejsza:

from django.shortcuts import render_to_response
from django.template import RequestContext

def foo(request):
# …
return render_to_response(‘foo.html’, {‘bar’: baz},
[…]

Python: prawdziwy polimorfizm

Taki week­en­dowy żarcik:

#!/usr/bin/env python
import random

class Foo(random.choice([int, str, uni­code, Excep­tion])):
pass

f = Foo(‘1’)
print ‘f‘

Django: szybszy SQLite do testów

Domyślna kon­fi­gu­ra­cja SQLite każe mu syn­chro­ni­zo­wać plik bazy po każ­dej ope­ra­cji. W środo­wi­skach testo­wych nie musimy się mar­twić o spój­ność danych w wypadku awa­rii, poni­żej zamiesz­czam więc bac­kend pozba­wiony zbęd­nego narzutu:

from django.db.backends.sqlite3.base import (
Data­ba­seW­rap­per as Sqlite3Wrapper,
Data­ba­se­Er­ror,
Inte­gri­ty­Er­ror,
Data­ba­se­Fe­atu­res,
[…]

Django: alternatywa dla Form.as_table()

Domyślna struk­tura gene­ro­wana przez metodę django.forms.Form.as_table pozo­sta­wia nieco do życze­nia. Stąd nieco wygod­niej­sza i nie­in­wa­zyjna wer­sja w postaci fil­tra (zasta­na­wiam się, czemu ta wbu­do­wana w Django ma postać metody):

from django.template.loader import render_to_string

@register.filter
def as_table(form):
return render_to_string(‘form_as_table.html’, {‘form’: form})

Do kom­pletu przy­kła­dowy szablon:

{% for f in form %}
{% if f.errors %}
<tr […]

Django: Decimal i simplejson

Moduł django.utils.simplejson nie obsłu­guje domyśl­nie typu decimal.Decimal. Na szczę­ście da się podać wła­sny mecha­nizm kodo­wa­nia nieznanych typów:

import deci­mal

def json_encoder(value):
if isinstance(value, decimal.Decimal):
return float(str(value))
else:
raise TypeError

from django.utils import simplejson

print simplejson.dumps([decimal.Decimal(‘1.2′)], default=json_encoder)

Python: Utop sierotki w zupie

Ot, taki znak, że nie umar­łem. Dziś w pro­gra­mie dość popu­larny błąd składu, choć wielu uważa, że inter­netu reguły nie doty­czą. A sie­rotki wykończymy tak:

import re

def sierotki(text):
reg = re.compile(u’\b(a|i|o|u|w|z)\b\s+’)
return reg.sub(u’\1u00a0’, text)

Nie­stety, na ogół mamy do czy­nie­nia z tek­stem zawie­ra­ją­cym znaczniki:

import re
from Beau­ti­ful­Soup import BeautifulSoup

def sierotki(text):
[…]

Python, Whoosh i błędy

Tytu­łem wstępu: Who­osh to bar­dzo przy­jemny sil­nik indek­su­jący i wyszu­ku­jący doku­menty w try­bie full-text. Nie­stety, masa ludzi ma pro­blemy z jego wdro­że­niem.
Objawy
Główne objawy to:
OSEr­ror: [Errno 17] File exi­sts: ‘/path/to/index/cache/_MAIN_LOCK’

oraz:
IOEr­ror: [Errno 2] No such file or direc­tory: ‘/path/to/index/cache/_MAIN_123.tiz’

Oba z nich są na ogół róż­nymi obja­wami faktu, że wię­cej niż jeden pro­ces pró­buje uży­wać tego samego indeksu […]

Django hack: wiele domen i jedna instancja

Pozwala ser­wo­wać wiele domen za pomocą jed­nego tylko pro­jektu Django. Inspi­ra­cją był ten snip­pet.
Zmiany w settings.py:
from thre­ading import local

SITE_THREAD_INFO = local()
SITE_THREAD_INFO.SITE_ID = 1

class SiteIDHook(object):
def __int__(self):
return SITE_THREAD_INFO.SITE_ID
def __hash__(self):
return SITE_THREAD_INFO.SITE_ID

SITE_ID = SiteIDHook()

Nowa klasa […]

Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Poland
This work by Patryk Zawadzki is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Poland.