[python] globalni promenne

Jan Svec honza na py.cz
Středa Únor 12 19:28:10 CET 2003


On Wed, 12 Feb 2003, Zdenek Pavlas wrote:

> Petr Mach wrote:
>
> > To se ale mylite. Jestlize mam datove promenne, ktere
> > pouziva naprosta vetsina funkci, resp. nejaka velka
> > skupina funkci, je zadouci aby k nim meli transparentni
> > a snadny pristup. A to i v pripade, ze z duvodu velkeho
> > poctu jsou kvuli prehlednosti definovany ve vice
> > souborech. Jde o to, jak jazyk umozni s globalnimi promm.
> > nakladat, aby v nich byl poradek a ne zmatek. Jazyk
> > PHP nebo treba JavaScript s tim nema zadne problemy.
>
> Myslim ze python s tim take nema problemy, staci pouzit
> "import modul", a pak se odkazovat na "modul.global_var".
> Problem je pouze pokud mate globalni promenne v modulu
> __main__, a chcete se na ne dostat z jineho modulu.
> Nevim o jine metode nez pres sys.modules['__main__'] :(
>

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!

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.

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.

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.

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.

--
S pozdravem
Jan Svec

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




Další informace o konferenci Python