Prawidłowe użycie: def foo(bar, *args, **kwargs): frobnicate(bar) baz(*args, **kwargs) Nigdy tak¹: def foo(bar, *args, **kwargs): frobnicate(bar) baz() ¹ Z wyjątkiem kilku API, które wyraźnie rezerwują sobie możliwość wprowadzenia dodatkowych parametrów. Działają tak np. wbudowane sygnały w Django. Ciche połykanie śmieci w parametrach w malowniczy sposób zemści się przy pierwszej literówce w kodzie. I będzie ci […]
Archive for the ‘code’ Category
To jest mój wątek i nie oddam go nikomu
Bezstanowość protokołu HTTP jest faktem. Niezależnie od tego, czego chciałby autor danej aplikacji. Na przykład nie jest prawdą, że jeden proces lub wątek serwera jest przypisany jednemu, konkretnemu odwiedzającemu stronę. Wybaczcie zatem łzy, które zakręciły mi się w oczach na widok tego: def _get_taxprocessor(request=None): taxprocessor = get_thread_variable(‘taxer’, None) if not taxprocessor: if request: user = request.user […]
Być jak Satchmo
Z pewnością naczytałeś się już, jakie to Satchmo nie jest doskonałe, zazdrościsz i chciałbyś stworzyć coś równie wspaniałego. Dość jednak nieprzespanych nocy, albowiem przygotowałem krótki poradnik, który w kilku krokach pozwoli ci dorównać mistrzom. Sięgaj tam, gdzie import nie sięga Tak jest, zacznij od stworzenia modułu z myślnikiem w nazwie. Niestety, oczywista nazwa email-auth.py została […]
Python: finanse
Nie dalej jak wczoraj kolega podesłał mi łatkę do mojej biblioteki do słownego zapisu liczb i kwot. Nie zdradzę od kogo, by chronić niewinnego. Grunt, że łatka wyglądała tak: — to_words_pl.py (upstream) +++ to_words_pl.py (working copy) @@ –82,7 +82,7 @@ iteration += 1 if unit: result.append(unit) — result.append(u’%d/100′ % int(remainder * 100)) + result.append(u’%d/100′ % int(round(remainder […]
Python: wyjątkowo głupi pomysł
Nigdy nie róbcie tak: try: # … except FooException, e: # … raise e Wyjątki przepuszcza się tak: try: # … except FooException: # … raise Istotna różnica polega na niezniszczeniu całego stosu wywołań. Z góry dziękuję.
Django: abstrakcji ciąg dalszy
Tym razem inne podejście, naturalne dziedziczenie abstrakcyjnych modeli z dwoma dodatkowymi metodami. W przeciwieństwie do poprzedniego przykładu, pozwala używać super() w abstrakcyjnych klasach pośrednich. from django.db import models class AbstractMixin(object): _classcache = {} @classmethod def contribute(cls): return {} @classmethod def construct(cls, *args, **kwargs): attrs = cls.contribute(*args, **kwargs) attrs.update({ ‘__module__’: cls.__module__, ‘Meta’: type(‘Meta’, (), {‘abstract’: True}), […]
Django: zabawa z abstrakcją
Zastanawialiśmy się ostatnimi czasy, w jaki sposób zbudować aplikację tak, by z jednej strony była uniwersalna (abstrakcyjne modele bazowe), a z drugiej zawierała całą niezbędną logikę. Problem polega na tym, że — z oczywistych względów — klucza obcego do modelu abstrakcyjnego stworzyć się nie da. Pozostaje więc zwalić pracę na programistę, który konkretyzuje abstrakcyjne prototypy, […]
twojastara.py
fat = unicode print type(ur’mom’) is fat Tak, tak, poniżej krytyki. Za to już niedługo: seria niewyjaśnionych znalezisk w kodzie Satchmo (czyli jak Pythona używać nie należy).
Django: TestCase i testowanie szablonów
Bardzo brzydki hack, oparty o załącznik do ticketu 7611. Czyści wewnętrzny cache Django, ale pozwala testować działanie kodu opierającego się o renderowanie szablonów bez ryzyka, że aplikacja owe szablony nadpisze: import os import sys from django.conf import settings from django.template import loader from django.test import TestCase class TemplateTestCase(TestCase): def _pre_setup(self): self._template_setup() super(TemplateTestCase, self)._pre_setup() def _post_teardown(self): […]
Django: pluralize
Najważniejszą rzeczą, jaką powinniście wiedzieć na temat filtra pluralize jest ta, żeby go nigdy nie używać. Nigdy. Jego istnienie wynika z lenistwa ludzi, którzy nigdy w życiu nie przygotowywali aplikacji do tłumaczenia. Jeśli nie wyraziłem się dość jasno, używanie filtra pluralize wywoła u ciebie raka, stereoporoże i zatwardzenie rozsiane. Jakkolwiek sprytnie by nie wyglądał, ten […]

