[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