[python] Dekorátor

Radek radek.hnilica na gmail.com
Pondělí Únor 21 23:00:26 CET 2011


On 21 ún, 15:01, Hynek Fabian <hynek.fab... na firma.seznam.cz> wrote:
> Radek (Wednesday 16 of February 2011 15:23:07):> nejdřív bych se uvedl, jsem takový opakovaný začátečník,  k Pythonu
> > jsem naposled přičichl možná před osmi lety a nic moc.  Teď, asi tři
> > měsíce zpátky jsem se k němu vrátil, protože si hraju s GAE/P.  Přes
> > všechny problémy se zkouším prokousávat, ikdyž python bolí,
>
> Něco děláš špatně. Kde to bolí?

To je na takové to domácí popovídání.  Poslední roky jsem psal v Bashi
a něco v Ruby.  Z objektových systémů beru jako laťku se kterou
srovnávám právě to Ruby.  Když jsem začal hledat literaturu a zdroje
ke studiu, řekl jsem si že když je spousta textů stylu  "Java pro
céčkaře", "Python pro fyziky".  Že bych se porozhlédl jestli není něco
jako Python pro Rubisty.  Bohužel nenašel.  Tak jediným zdrojem je to
co po různu najdu.  Snažím se postupně jednotlivé problémy řešit ale
lámání je na dlouho.  Asi bych si měl psát všechny nejasnosti bokem
abych je měl po ruce, ale takto se spoléhám jen na svou děravou hlavu.

Co mě opravdu dostalo, a to jsem měl chuť projít stropem, byla práce s
časem.  Potřeboval jsem jednoduchou věc, vzít časovou/datumovou
informaci od uživatele a udělat z ní časový objekt.  Ke své hrůze jsem
zjistil, že to tak nějak nejde.  Na IRCu se mi podařilo odchytit
nějakého programátora, a má hrůza se začala stupňovat jak jsem
zjišťoval ža ani nechápe co chcu.  Obyč funkci, nejlépe metodu
časového objektu, které nacpu řetězec od uživatele jako string a
dostanu objekt.  Neustále říkal že přece nic problém, že to umí metoda
strptime a je to popsáno v dokumentaci.  Opětovně po několikáté jsem
velmi pečlivě četl tu stránku v dokumentaci a nechápal, protože
strptime je na tohle absolutně nepoužitelná.  Nakonec jsem objevil na
netu knihovnu která to umí.  Ale strávil jsem dost času zjišťováním že
čistý python a dodané knihovny jsou v tomhle ohledu přinejmenším
neúplné.

A to je jen ukázka jednoho z mnoha případů kdy mi dlouhé hodiny,
případně celé dny trvá najít řešení.

Potřeboval bych nějakou rozumnou dokumentaci, a nevím kde ji vzít.
Většina toho na co se lidi odkazují a co používají se mi zdá tak
podivně strohé  Viz Pythoní dokumentace k datetime.

Často když něco píšu, tak mám představu co vlastně dělám, jen nevím
jak se to píše v Pythonu.  I chtěl bych třeba, k danému objaktu, znát
všechny metody a vlastnosti co má.  A neumím nikde najít takový
přehled.  Takový přehled jako má například dokumentace k Ruby.
Nakliknout si Modul/Objekt a dostanu metody.  Nakliknu metodu a mám
podrobný popis k čemu že vlastně slouží, jak se jí dávají parametry a
ukázkou několika použití.

Další "drobnost" na kterou jsem narazil je join.  Prostě potřebujete z
seznamu který máte, nebo který držíte "uprostřed výpočtu na tečce"
udělat řetezec.  Něco jak seznam.join(',').  Tohle je naštěstí tak
profláknuté, že už jsem si zapamatoval že v Pythonu je join metoda
toho ',' a ne toho pole.

> > Jen tím že chci aby měl dekorátor parametry, se tak radikálně změní
> > kód dekorátoru.
> > Potřeboval bych nějak po lopatě vědět, co se uvnitř děje, protože
> > cítím že ty dekorátory budu určitě používat ještě mnohem divočeji.
>
> Vtip je v tom že se ve skutečnosti kód nijak nemění. Intuitivní představa že
> parametry v závorkách by měly být předány dekorátoru je jen optický klam.
> Pokud mám dekorátor jménem "spam"

jj teď už to vim, začal jsem si dělat obrázek o tom jak to funguje a
kdy se co vyhodnocuje a jak to dopadne.

> Osobně považuji použití objektů k dekoraci za nešťastné. Metoda "uzávěra v
> uzávěře" sice vypadá zezačátku děsivě, ale je aspoň přímočará a dá se pochopit
> co se děje uvnitř. Objekty jen nahradí jednu složitost jinou (kolik lidí chápe
> nuance metod __call__, __new__ a __init__?).

No jde o to, že jsem neviděl dost příkladů abych si udělal obrázek.
Jedno z prvních vysvělení dekorátorů které jsem viděl používalo třídu
s odůvodněním že je to mnohem snažší na pochopení, tak jsem se toho
držel.  Můžu zkusit svůj případ přepsat s použítí třídy na použítí
funkce.  Ale nebude to možná mít ten správný efekt, protože jsem ostrý
okód tak refaktorizoval, že z něj už moc nezbylo. (Jak jsem zmiňoval,
původně tam byly další dvě metody které se volaly).  Další věc je, že
mám někde v hlavě špendílček zaražený k dekorátoru že bych mohl využít
dědičnost při tvorbě různých druhů authorizačních dekorátorů.  Jako že
základní princip a pak BasicHTTP, Session, ..... poděděné z něj.



Další informace o konferenci Python