[python] Deferred output

Hynek Fabian hynek.fabian na firma.seznam.cz
Čtvrtek Únor 11 15:40:24 CET 2010



matesfila (čtvrtek 11 Únor 2010 14:47:31):
> Funkcia f, ktorá využíva premennú x, môže byť definovaná ešte predtým, ako
Zapomen na definovani a zjistis ze to tak slozite neni. U podobne 
komplikovanych konstrukci muze byt obtizne domyslet dusledky, ale vsechno to 
vyplyva z jednoduchych pravidel. Nejsou zadne deklarace - krome hrube kontroly 
syntaxe se vsechno provadi v jedine sekvenci (proto v pythonu nejsou zadna 
makra). Kdyz program dojde ke konstrukci def, class nebo =, strci vysledek do 
patricneho jmenneho prostoru. To je cele, jediny co je na tom slozity je 
zbavit se memu 'deklarace' a s tim spojene predstavy kompileru ktery predem 
'zna' strukturu programu. Viz nasledujici primitivni uzavera:
def foo():
    def bar():
        pass
    return bar

Ve staticky kompilovanem jazyku je bar() jedina metoda ve vlastnim oboru 
platnosti. V pythonu neni zadna funkce bar() dokud nezavolam foo(), a pak si 
ji musim predat pomoci return ven ze jmenneho prostoru foo() pokud ji chci 
videt i jinde.
A naopak, kdyz foo() zavolam dvakrat tak interpret dvakrat narazi na 
konstrukci "def bar():…" a vytvori dve ruzne (!) funkce
a = foo()
b = foo()
a is b	# False


> Pre aké jazyky je vlastné takéto chovanie typické? Súvisí to s
> beztypovosťou jazyka, alebo s tým, že je jazyk skriptovací, alebo s čím
> vlastne?
afaik se tomu rika pozdni vazba (late binding) a je to celkem bezna vlastnost 
skriptovacich jazyku (krome Javy ktera si hraje na kompilaci)
U kompilovanych jazyku se to moc nevyskytuje, protoze kdyz kompiler nevi typ 
toho co kompiluje, tak toho moc nenakompiluje :-) ale neni to podminka - treba 
virtualni metody v C++ jsou castecne pozdni vazba (za cenu toho ze nejsou tak 
uplne staticky kompilovane).

uff to jsem se rozpesul, holt javisticky predsudky je potreba potirat :-)


Další informace o konferenci Python