Re: [python] Nesrozumitelne prirazovaci prikazy zamichane mezidefinice standalone funkci v modulu
On 7/9/07, Petr Prikryl <[EMAIL PROTECTED]> wrote: > Petra Javornicka > V Pythonu se v čistém slova smyslu nic nedělá v compile-time. > Všechno jede spíš v run-time. Jde jen o to jestli dříve (při Ja bych v cistem slova smyslu rekla, ze se to preklada, protoze vznika nejaky p-kod, ne? A kdyz se neco preklada, tak je to v compile-time, ne? ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Nesrozumitelne prirazovaci prikazy zamichane mezidefinice standalone funkci v modulu
Petra Javornicka > regnarG > > > Je to úplně to samé. Zavolá funkci a výsledek vloží do proměnné. > > Jediný rozdíl je v tom, že D je funkce která vrací funkci. > > IMHO ale to je ten nejpodstatnejsi rozdil, protoze ta D funkce tu > druhou vraci v 'compile-time' , zatimco ta vracena se vykona az v > 'run-time' a pri cteni toho zapisu clovek musi vedet, ze ta D funkce > vraci jinou 'executive' funkci, proto mi ten zapis nedaval porad > smysl. Pak samozrejme interpetr nepotrebuje nic poznavat. V Pythonu se v čistém slova smyslu nic nedělá v compile-time. Všechno jede spíš v run-time. Jde jen o to jestli dříve (při zpracování definice funkce) nebo později (po dokončení zpracování definice funkce, kdy ji můžeme hned volat). pepr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Nesrozumitelne prirazovaci prikazy zamichane mezidefinice standalone funkci v modulu
On 7/9/07, Petr Prikryl <[EMAIL PROTECTED]> wrote: > Jestli nemáte chuť do toho se Python aspoň trošku naučit, [...] > smažte ho rovnou. Ale za 2 dny mu na chuť nepřijdete. No to abych se skoro ohradila ;-) Kdybychom nemeli chut se Python *ucit*, tak se jim vubec nebudeme zabyvat, protoze za dobu, kterou jsme stravili studiem Pythonu a Djanga bychom meli davno tu web aplikaci hotovou. A jestli to smazeme, tak proto, ze dojdeme k nazoru, ze s jinou technologii udelame s mensimi naklady vice muziky... A co se tyce vlastniho procesu uceni - potrebovali bychom nejakou slusnou dokumentaci/ucebnici. Python tutorial jsme zvladli, Pilgrimmovo Dive in Python taky, ale s reference guidem, ten nam pripada trochu poslabsi - nektere veci jako napr. logging jsou tam rozebirany vcetne prikladu ad absurdum, jine veci jsou jen letmo dotceny. Treba zrovna ty dekoratory: kdyz je budes hledat v obsahu - nejsou. V indexu - nejsou. Kdyz je predhodis Googlu a omezis ho na site:docs.python.org, tak to najde tu kapitolu, cos mi poslal. Ale tam nikde neni uvedeno, ze dekorator musi vracet jinou 'executive' funkci. To se predpoklada jaksi samo sebou. Zato na teze strance maji naprosto banalni default argumenty i s prikladem. A teprve, kdyz das Googlu hledat samotny dekorator, najdes ho nekde v PEP318 (nebo kolik). Takze vic nez uceni vlastniho Pythonu nam zabira vyznat se v jeho dokumentaci a najit v ni relevantni informace. Jeste horsi je to s ti Djangem :-( ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Nesrozumitelne prirazovaci prikazy zamichane mezidefinice standalone funkci v modulu
Petra Javornicka > > [...] To je jasny, ale porad nevim, odkud bere interpretr > odlisit informaci, aby mohl > g=D # pointer > d=D(f) # taky pointer :-O > d=D(n) # dereference - call > > U syntaxe dekoratoru s prefixem '@' se to zda byt jasny. > Ale u funkce utrousene nekde mezi definicemi? Za klíčové považuji pochopit, jak funguje dekorování funkce bez použití @. Je to historicky starší, funguje to úplně stejně, jen se to líp zapisuje a čte (což je důležité). To "u funkce utroušené mezi definicemi" je taky důležité pro pochopení. Při zápisu bez @ lze dekorování provést až za koncem definice funkce. Pythonovský zdroják se zpracovává sekvenčně shora dolů a ihned se provádí. Když se narazí na definici funkce, vytváří se vnitřní objekt funkce (ekvivalent kompilace) a vytvoří se reference pojmenovaná předepsaným identifikátorem funkce. Ten identifikátor ale od té doby není nijak výsadní (snad jen, že je v objektu funkce textově zachycen pro účely ladění nebo pro jiné introspektivní použití). Pokud mám například def mojeFunkce(n): return n * 5 Pak si ji můžu kdykoliv přejmenovat: f = mojeFunkce ... protože identifikátor mojeFunkce je jen pojmenovaná reference na vnitřní objekt funkce (objekt v technickém smyslu, tj. podoba, do které je definice funkce zpracována). Můžu si pak ověřit, že příkazy vypíšou stejnou identifikaci print id(mojeFunkce) print id(f) ... která je v momentální implementaci Pythonu totožná s adresou (objektu) funkce. Za předpokladu, že reference odkazuje na "callable" objekt, chápe se za volání zápis, kdy za referenci uvedu kulaté závorky (s argumenty nebo bez). Když se následující příklad uloží do souboru d.py def mojeFunkce(n): return n * 5 f = mojeFunkce print id(mojeFunkce) print id(f) print mojeFunkce(3) print f(3) def trivialniDekorator(fce): return fce f = trivialniDekorator(mojeFunkce) print id(mojeFunkce) print id(f) print mojeFunkce(3) print f(3) def prazdnyDekorator(fce): def obalujici_funkce(n): return fce(n) return obalujici_funkce f = prazdnyDekorator(mojeFunkce) print id(mojeFunkce) print id(f) print mojeFunkce(3) print f(3) def plusJedna(fce): def plusOne(n): return fce(n) + 1 return plusOne # Znovu pouziju identifikator mojeFunkce. Od teto chvile se # zahodi reference na puvodni objekt funkce, coz ale neznamena, # ze by objekt puvodni funkce zanikl. mojeFunkce = plusJedna(mojeFunkce) print id(mojeFunkce) print mojeFunkce(3) # Pri selhani volane funkce se vypise trasovaci zprava, ktera mimo # jine uvadi originalni identifikace funkce, ktera je sice stejna, jako # pojmenovana reference, ale novy identifikator jiz odkazuje na funkci # na jine adrese. print id(mojeFunkce) mojeFunkce(None) Pak se po zavolání programu vypíše následující C:\tmp>python d.py 17722800 17722800 15 15 17722800 17722800 15 15 17722800 17722992 15 15 17723120 16 17723120 Traceback (most recent call last): File "d.py", line 52, in mojeFunkce(None) File "d.py", line 35, in plusOne return fce(n) + 1 File "d.py", line 2, in mojeFunkce return n * 5 TypeError: unsupported operand type(s) for *: 'NoneType' and 'int' pepr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Nesrozumitelne prirazovaci prikazy zamichane mezidefinice standalone funkci v modulu
> V obou případech se jedná o volání funkce. Avšak D(f) vrací nově vyrobenou > funkci, což je možná matoucí. Jojo - to je ten stripek do mozaiky - dokud se clovek nepodiva, ze je uvnitr D(f) zahnizdena dalsi funkce, ktera udela skutecnou praci v run-time, zatimco ta D(f) se spusti jen compile-time, tak je z toho Gogo Petra ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Nesrozumitelne prirazovaci prikazy zamichane mezidefinice standalone funkci v modulu
> > h=f(2) uloží do h návratovou hodnotu volání funkce f pro dva > > g=D(f) uloží do g odkaz na novou funkci obalující f > > Jak je videt, tak to to samy neni, protoze stejna syntaxe, > ale jina semantika. > Cim se teda ten interpretr ridi? - ze kdyz funkce dostane > proceduralni argument, tak to bere jako odkaz a ne jako volani? V obou případech se jedná o volání funkce. Avšak D(f) vrací nově vyrobenou funkci, což je možná matoucí. Jan Matějka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Nesrozumitelne prirazovaci prikazy zamichane mezidefinice standalone funkci v modulu
Mozna pomuze tento priklad: def dekoruj_funkci(f): #funkce, ktera vytvari FUNKCI def dekorovana(): #vytvorime novou funkci obalujici funkci f print "pred volanim" f() print "po volani" return dekorovana def index(): print "index" index=dekoruj_funkci(index) #prekryjeme puvodni funkci index (do promenne index vlozime novy obsah (funkci) navraceny funkci dekoruj_funkci) index() #volani prekryte fynkce Jan Matejka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Nesrozumitelne prirazovaci prikazy zamichane mezidefinice standalone funkci v modulu
Petra Javornicka se zeptala > [...] > Radek vysvětluje > > To se pouziva misto tzv. dekoratoru, ktere jsou zavedene > > az od Pythonu 2.4. > > Aha, ja zacala s Pythonem az od verze 2.5. Lépe řečeno, dekorátory byly zavedeny kvůli tomu, aby se dodatečná manipulace s funcí/metodou dala předepsat jako kdyby byla součástí definice funkce/metody a ne až někde vzadu. Podrobnosti viz také http://docs.python.org/ref/function.html > > Funguje to tak, ze dana funkce (tady index) se obali jinou, > > Takze se mohou obe stejne jmenovat? Jak se to jmeno pak > resolvuje, kdyz jednou je to regulerni funkce, podruhy > takovahle pythomost, kde je stejny jmeno na levy i pravy > strane :-O A podle ceho se pozna, ze to neni obycejny > konflikt jmen - podle toho, ze je vlevo i vpravo? Python není kompilovaný jazyk. Funkce (v logickém smyslu) po zpracování definice existuje v systému jako bezejmenný plnohodnotný objekt (v technickém smyslu), který se dá volat a který je zpřístupněn pojmenovanou referencí. To jméno se vztahuje k referenci a ne k funkci samotné. Funkce samotná si jako vnitřní objekt nese všechny vlastnosti s výjimkou jména ;) ... jako ostatně všechno v Pythonu. > > Jo, ne ze bych chtel z teto konfery odebirat lidi, ale kdyztak ciste > > pro Django mame ceskou diskuzni skupinu: > > http://groups.google.com/group/django-cs > > O odebirani lidi nemusis mit obavy - ja neumim ani Python ani Django. > > Uz jsem se tam prihlasila, i kdyz popravde receno, cim vice o Djangu > vim, tim min se mi libi a po nedeli budeme rozhodovat, jestli v nem > zkusime udelat novy projekt a nebo ho smazeme i s Pythonem z pocitacu ;-) Jestli nemáte chuť do toho se Python aspoň trošku naučit, smažte ho rovnou. Co se týká vlastností Pythonu, je prostě jiný, než kompilované jazyky. Umožňuje dělat věci, které se z principu v kompilovaných jazycích dělají obtížně. Ale za 2 dny mu na chuť nepřijdete. pepr ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python