[python] globalni promenne

Jan Svec honza na py.cz
Čtvrtek Únor 13 20:25:17 CET 2003


On Thu, 13 Feb 2003, Petr Mach wrote:

> > Pokud se nemylim, tak lze provest 'import __main__'...
> >
> > Muj nazor na tento thread zni takto: globalni promenne jsou
> > prezitek. Pokud touzite po jakemsi zapouzdreni, pouzijte
> > OOP!
> Ne, ja netouzim po zapouzdreni, ja chci jednoduse mit
> sdilene promenne a chci je mit sdilene i po tom, co je
> rozdelim do nekolika souboru.

No prave, musite si zvyknout na to, ze Python nektere veci
zapouzdruje, cili zapouzdruje kod do modulu a proto zde
nemuzete pouzit to, co chcete a znate z PHP.

> > Podle meho globalni promenne jak je pouziva Python jsou na
> > vysi, presne takto maji podle meho slouzit. To co je
> > globalni je globalni pouze pro jeden modul. A pokud se chci
> > odkazovat na neco jineho, musim pouzit teckovou notaci. A
> > nebo (dulezite!) na objekt vytvorit odkaz (!). Dulezite je
> > pochopit, ze Python NEMA promenne! V Pythonu jsou pouze
> > odkazy na objekty. Promenna, tak jak tento pojem chape
> > vetsina pocitacove verejnosti zde neexistuje, promennou
> > mnohdy oznacujeme misto v pameti.
> To je v tomto pripade (problem s namespace) prece uplne
> jedno, jestli promenna (jeji jmeno) uchovava hodnotu nebo
> odkaz na objekt.

To je jen na vysvetleni proc na globalni urovni nefunguje
from module import name ale funguje to v urovni funkce.

> > Ale protoze Python je jazyk objektovy (nikdo mi to
> > nevymluvi), tak zde existuji objekty, na ktere vytvarim
> > odkazy. A pokud si v lokalnim prostoru (nebo jakemkoli jinem)
> > vytvorim odkaz, pak odkazuje na objekt, cili pokud v
> > puvodnim jmennem prostoru (ve vyse uvazovanem threadu onen
> > "globalni" modul) zmenim, tj. predefinuju odkaz tak, aby
> > ukazoval na nejaky jiny objekt, zmena se v kopii odkazu
> > nepromitne! Kolikrate jsem premyslel (k implementaci jsem se
> > nedostal) nad tim vytvorit objekt "odkaz", ktery by pracoval
> > jako proxy a ktery by si pamatoval jmeno promenne na kterou
> > ukazuje a tu by take modifikoval. Zatim jsem ho nakonec
> > nikdy nepotreboval.
> Ale o to prece prave jde, ze ja se chci odkazovat porad na ten
> samy objekt. Pro vas tedy nebudu tvrdit, ze chci sdilet promenne,
> ale ze chci sdilet odkazy na ty promenne, je to prast jak uhod.

Nechcete se odkazovat na stale stejny objekt, kdyz provedete
definujete promennou 'foo = 1' pak foo odkazuje na objekt
reprezentujici jednicku, kdyz nyni provedete 'foo = 2', uz
foo neodkazuje stale na ten samy objekt (jak chcete vy), ale
na objekt reprezentujici dvojku. Takze NECHCETE odkazovat
stale na ten samy objekt! Jako domaci cviceni si prosimvas
prectete neco o promennych a nemennych objektech a
namespace, prosim.

> > Je vsak treba pripomenout, ze globalni promenne a jejich
> > pouzivani svedci o spatnem navrhu a ze "Neco shnileho je ve
> > state Danskem." Stejne tak by dobre navrzeny program mel jit
> > rozdelit do modulu v libovolne fazi vyvoje. Pokud tak tomu
> > neni, dozajista jste porusil jedno z pravidel programovani:
> > Think first, program latter.
> Tohle je hezka teorie, ale praxe byva ruzna. Byl jsem pozadan
> o udelani kratkeho programku. Odhadem tak 50 radku. Jenze
> pak se ukazalo, ze by bylo dobre, kdyby to umel jeste jednu
> drobnost (zas jen par radek) a pak dalsi a tak dale. Az se to
> neumerne rozrostlo. A tak vyvstala potreba rozdelit ten
> soubor do nekolika, aby se s tim snadneji delalo. Nemam potrebu
> mit vic modulu, nemam potrebu mit vice globalnich prostoru.
> To mi nuti Python, ja o to v tomto pripade nestojim, jen chci
> ten dlouhy kod mit ve vice souborech. Stacilo by, kdyby
> python podporoval krome prikazu import i prikaz include, ktery
> by soubor nevnimal jako dalsi modul.

Vim, ale porad muzete pouzivat techniky, ktere vam umozni
kod rozdelit. Staci myslet dopredu.

> Takze ano neco shnileho tu je. Ale imho v pythonu, ktery
> neumoznuje veci bezne v jinych jazycich, at uz pomoci
> preprocesoru, jako C nebo potrebnych prikazu, jako treba
> PHP.

Veci bezne v Pythonu ani zdaleka neumoznuji jine jazyky!
Proto se nesnazte z Pythonu udelat objektove PHP, nema to
cenu a Guido dobre vi, proc to dela takhle. Prece vsechny
jazyky nemusi vypadat stejne a nemusi podporovat stejne
veci, ze?

> > A jeste jedno, nedokazu si predstavit vase starosti, pokud
> > byste se rozhodl zmenit architekturu programu (napr.
> > pouzivani vlaken apod). Nechci vam do niceho zasahovat, ale
> > Python si urcite zaslouzi programovat v nem objektove.
> Az mi Python a predevsim jeho knihovny umozni programovat
> opravdu objektove, tak proc ne.

Tak to mi vysvetlete, cely Python je objektovy, vy pouze
nechapete co slovicko objektovy znamena (viz. vyse kde jste
mne nepochopil u pasaze s odkazy na objekty atd.).

--
S pozdravem
Jan Svec

<honza na py.cz>
http://dev.py.cz/users/honza




Další informace o konferenci Python