Re: [python] Nesrozumitelne prirazovaci prikazy zamichane mezidefinice standalone funkci v modulu

2007-07-09 Tema obsahu Petra Javornicka
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

2007-07-09 Tema obsahu Petr Prikryl
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

2007-07-09 Tema obsahu Petra Javornicka
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

2007-07-09 Tema obsahu Petr Prikryl
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

2007-07-09 Tema obsahu Petra Javornicka
> 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

2007-07-09 Tema obsahu Jan Matejka
> > 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

2007-07-09 Tema obsahu Jan Matejka

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

2007-07-08 Tema obsahu Petr Prikryl
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