[python] globální proměnné

Radek Kanovsky rk na dat.cz
Pondělí Prosinec 20 16:24:04 CET 2004


On Mon, Dec 20, 2004 at 01:30:44PM +0100, p.kosina wrote:

> >Definice a použití funkce r() a použití třídy do toho nic
> >nového nevnáší. Je to jen krkolomě zapsané vytvoření
> >inicializace proměnné uvnitř existujícího objektu.
> 
> napsal jsem spatny priklad, zde je lepsi, proste modikace promenné
> univtr kterekoliv funkce, jako jakysi superglobal (to by mohl byt nazev
> toho noveho klicoveho slova, který by toto delal :-)):
> 
> class G:
> 	pass
> def f():
> 	x.what=x.what+10
> 
> x=G()
> x.what=10
> f()
> print x.what #---> 20

Pouzivanim funkci nebo metod, ktere maji vedlejsi ucinky je podle me
velmi problemove a nepythonovske reseni. Pokud potrebujete do funkce
nebo do metody dostat nejaky kontext nebo globalni data, tak je tam
radeji predejte jako argument v nejakem zapouzdrenem objektu:

    class CTX :
        def __init__ (self) :
            self.x = 10

    def add10 (ctx) :
        ctx.x = ctx.x + 10
    
Konkretne tohle by ale bylo mnohem lepsi udelat nasledovne. Pokud metoda
'f' pracuje pouze s globalnimi daty, proc ji nepresunout do tridy G?

    class G :
        def __init__ (self) :
            self.x = 10
        def add10 (self) :
            self.x = self.x + 10

    g = G()
    g.f()

Reseni, ktere navrhujete, se vetsinou hodi a pouziva pouze pro read-only data
jako ruzne konstanty apod:

    class FCNTL :
        LOCK_SH = 1
        LOCK_EX = 2
        ....
        LOCK_UN = 8


Zdraví

Radek Kaňovský



Další informace o konferenci Python