Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Pythonin globaalit muuttujat ja moduulit

Janezki [16.05.2010 19:27:07]

#

Minulla on pieniä ongelmia Pythonin globaalien muuttujien kanssa. Tarvisin muuttujia joiden arvo asetetaan ohjelman alussa mutta niitä voidaan lukea sitten läpi ohjelman mistä tahansa moduulista.

## test.py ##

import test2

testVar = 666

def main():
    global testVar
    test2.doodle()
    print testVar

if __name__ == '__main__':
    main()
## test2.py ##
import test

def doodle():
    test.testVar = 777
    print test.testVar

Tuloste

777
666

Haluan että tuloste olisi

777
777

Miten korjataan?

Chiman [16.05.2010 21:36:59]

#

Globaalit ovat vähän ikäviä, enkä tiedä mitä laajemmin ottaen haet, mutta tässä yksi tapa:

## test.py ##

import test2

var_storage = {'testVar' : 666}

def main():
    test2.doodle(var_storage)
    print var_storage['testVar']

if __name__ == '__main__':
    main()
## test2.py ##

def doodle(var_storage):
    var_storage['testVar'] = 777
    print var_storage['testVar']

Janezki [16.05.2010 23:07:40]

#

No mikseipä tuokin toimisi, inhottaa vaan ikään kuin kuljettaa globaaleja muuttujia parametrina läpi ohjelman. Olisi parempi jos kaikki muuttujat ja vakiot olisivat samassa moduulissa eikä tarvitseisi harrastaa mitään akrobatiaa että saisi ne ulos sieltä.

ZcMander [16.05.2010 23:26:03]

#

Korjaus voisi olla esimerkiksi seuraavanlainen, ei kylläkään testattu, mutta idea käy toivottavasti esille.

Koodissasi nimittäin arvoa ei tulosteta lainkaan, ennen kuin arvo on asetettu 777:ksi.

## test.py ##

import test2

testVar = 666

def main():
    global testVar
    print testVar
    test2.doodle()
    print testVar

if __name__ == '__main__':
    main()
## test2.py ##
import test

def doodle():
    test.testVar = 777

Antti Laaksonen [17.05.2010 00:29:19]

#

Yksi ratkaisu on pitää globaalit muuttujat omassa moduulissaan ja ottaa kyseinen moduuli mukaan kaikkiin muihin moduuleihin:

# muuttujat.py
testi = 666
# eka.py (pääohjelma)
import muuttujat
import toka
toka.muutos()
print muuttujat.testi
# toka.py
import muuttujat
def muutos():
    muuttujat.testi = 777
    print muuttujat.testi

Janezki [17.05.2010 08:05:23]

#

ZcMander kirjoitti:

Korjaus voisi olla esimerkiksi seuraavanlainen, ei kylläkään testattu, mutta idea käy toivottavasti esille.

Koodissasi nimittäin arvoa ei tulosteta lainkaan, ennen kuin arvo on asetettu 777:ksi.

...

Tuon tuloste on edelleen
666
666

Kun sen tässä tapauksessa pitäisi olla
666
777

Antti Laaksonen kirjoitti:

Yksi ratkaisu on pitää globaalit muuttujat omassa moduulissaan ja ottaa kyseinen moduuli mukaan kaikkiin muihin moduuleihin:

...

Ja tuo nyt sitten toimii. Johan on kumma. Ilmeisesti tuossa minun koodissa on kyse jostain ristiviittausongelmasta. Ajoin muutaman testin ja kaikki näyttää sujuvan hyvin niin kauan kuin muuttujamoduuli ei sisällä importtauksia.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta