Metaprogramozás I

Bevezető

A metaclassok nyitják meg a teret a metaprogramozás előtt kedvelt nyelvünkben. Megértésükhöz szükséges néhány fogalmat és építőelemet tisztázni, mert nem a metaclassok a nehezek magukban, hanem az a több tucat pythonos építőkocka sok, amit össze kell gyűjteni. RePa dekorátorjaihoz és descriptorjaihoz hasonlóan semmi olyat nem tesznek lehetővé amit vagy a megszokott...

Tovább…

25szept.
0

A descriptorok

A descriptorok (leírók) szintén a kedvenc python nyelvi eszközeim közé tartoznak. Teljes boldogságban élhetünk akkor is, ha fogalmunk sincs róluk, de bizonyos helyeken meg tudja szépíteni a programunkat. A dekorátorokhoz hasonlóan nem túl bonyolult dologról van szó, ha valaki használt már Djangót, akkor jó eséllyel találkozott velük, még ha nem is tud a létezésükről.

Djangóban a model mezői általában az adatbázis mezőnek megfeleltethető python típusok:

>>> from pages.models import Page
>>> p = Page()
>>> p.creation_date
datetime.datetime(2010, 8, 31, 10, 7, 30, 909404)
>>> type(p.creation_date)
<type 'datetime.datetime'>

Általában... nézzünk csak meg azonban egy ForeignKey típusú mezőt - ha nem rendelek hozzá értéket, akkor látszik a turpisság:

>>> p.author
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/django/db/models/fields/related.py", line 288, in __get__
    raise self.field.rel.to.DoesNotExist
DoesNotExist

Hmm, milyen __get__? Nezzük csak meg jobban, mi is a author mező:

>>> p.__class__.__dict__['author']
<django.db.models.fields.related.ReverseSingleRelatedObjectDescriptor object at 0x25a9710>
>>> dir(p.__class__.__dict__['author'])
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__',
 '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
 '__set__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'field']

És igen, megvan a tettes, aki nem egy sima mező, hanem egy descriptor, akinek már van __get__ (és esetünkben __set__) metódusa is. Na lássuk akkor mik is azok a descriptorok!

Tovább…

01szept.
5

Egy kis dekoráció

A python nyelvben a dekorátor egy "szintaktikai cukor" (szinte fáj az ilyet leírni magyarul), semmi újat nem ad a nyelvhez. A java annotációkhoz hasonló módon közvetlen a dekorálandó objektum elé helyezett, @ karakterrel kezdett kifejezés, amely például a klasszikus dekorátor tervezési minta használatához és sok más egyéb dologhoz jó. Lássuk hát mi is ez pontosan, illetve hogyan kell használni.

Tovább…

19aug.
9

Eltérő környezetek beállításainak kezelése Djangoval

Django alapú alkalmazásfejlesztésnél a settings modul hordozza a projektre jellemző konfigurációkat. Gyári kiszerelés esetén (django-admin.py startproject) ez tipikusan a settings.py fájl. Legyen bármilyen kis feladatról szó, célszerű az alkalmazás fejlesztői és éles környezetét szétválasztani. A két környezet adottságai nem szükségszerűen azonosak: eltérő adatbázis- és webkiszolgáló, más elérési útvonalak (path) sít. Hogyan lehet mégis a különböző szoftverkörnyezetek konfigurációját a settings modulban elkönyvelni?

Tovább…

17aug.
3

Python és az OOP

Ahogy már írtam, a python egy objektum orientált scriptnyelv, de nem vagyunk rákényszerítve az OOP-re, nyugodtan használhatjuk imperatív/procedurális módon, azaz kb. mintha perl- vagy shellscriptet írnánk. Nem kell main() függvény (mint C-ben), nem kell egy kvázi felesleges osztály egy public static void main(...) metódussal, szépen sorról sorra megcsinálja, amit mondunk neki.

Pár soros scriptecskénél ez hasznos tulajdonság, nagyobb projectekben viszont kerülendő.

Csak címszavakban, mi is az az objektum orientált programozás?

Tovább…

07aug.
9

A Python interpreter

Az egyik kedvenc dolgom a pythonban az az interpreter. Segítségével igen gyorsan ki lehet próbálni kódrészleteket, modulokat, sőt én számológépnek is azt szoktam használni - egy-két terminál mindig nyitva van nálam :)

Tovább…

03aug.
7

Singleton

A weblaboron olvastam ma egy cikket inf3rno tollából, amely az ősosztályként megvalósított singleton problémáját járja körül PHP-ban. (Egyke tervezési minta, de én nem szeretem az ilyeneket lefordítani, mert nagyon suta tud lenni, szerintem.) Pythonban sem egyértelmű a dolog, a klasszikus "legyen privát a konstruktor, és egy metódus adja vissza a példányt" megoldás nem működik, mert pythonban a konstruktor mindig publikus. Ennek ellenére nem az okoz nehézséget, hogy hogyan valósítsuk meg a singletont, hanem hogy a lehetőségek közül melyiket válasszuk :)

Nézzünk néhány példát, a teljesség igénye nélkül! Nem kell megijedni, ha kezdőbb olvasók nem teljesen értik a példákat, megértésükhöz szükséges a python nyelv bizonyos szintű ismerete.

Tovább…

27júl.
5

Helló Világ!

Hát üdvözlök mindenkit, oldalunk célja a Django keretrendszer, illetve maga a Python programozási nyelv népszerűsítése lenne - meglátjuk milyen sikerrel :)

Ha esetleg késztetést érzel magadban, hogy te is leírd pythonos/djangos tapasztalataidat, vagy bármit, aminek a témához köze, keress meg minket (pl. szólj hozzá ehhez a bejegyzéshez), és esetleg adunk hozzáférést az oldalhoz.

Tovább…

22júl.
0