[python] globalni promenne

Petr Mach gsl na seznam.cz
Čtvrtek Únor 13 13:53:17 CET 2003


Jan Svec wrote:

>>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!
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.

> 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.

> 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.

> 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.

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.

> 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.




Další informace o konferenci Python