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?
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']
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ä.
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
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
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.