Bezeichnung einer Variable
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Und wo genau ist jetzt das Problem, 'a' und 'b' in ein Dictionary zu packen und in write_config und read_config jeweils eine Schleife zu bauen?
-
- User
- Beiträge: 3
- Registriert: Samstag 29. März 2008, 18:15
Alle Variablen sind intern schon in einem dict (siehe locals).
du könnstet ja zum Beispiel alle Variablen die du abspeichern willst, nach einem bestimmten schema benennen (zum beispiel GROSS und evtl noch nen perfix für die das entsprechende modul)
dann kannst du, wenn du dir alle schlüsselworte von den locals geholt hast, diese durchgehen und schauen ob sie deinem schema entsprechen und dann mit deinem config tool abspeichern.
beim auslesen könntest du ja diese werte wieder zurück schreiben.
dieser Code zum Beispiel erstellt dir ne neue Variable a mit dem Wert 14
weiß jetzt nicht ob das eine schöner stiel ist, aber es funktioniert
du könnstet ja zum Beispiel alle Variablen die du abspeichern willst, nach einem bestimmten schema benennen (zum beispiel GROSS und evtl noch nen perfix für die das entsprechende modul)
dann kannst du, wenn du dir alle schlüsselworte von den locals geholt hast, diese durchgehen und schauen ob sie deinem schema entsprechen und dann mit deinem config tool abspeichern.
beim auslesen könntest du ja diese werte wieder zurück schreiben.
Code: Alles auswählen
meineVars = locals()
meineVars['a']=14
weiß jetzt nicht ob das eine schöner stiel ist, aber es funktioniert
-
- User
- Beiträge: 3
- Registriert: Samstag 29. März 2008, 18:15
RedSharky hat geschrieben:Könntest du mal ein Beispiel geben? Habe das erfolglos versucht.
Das Problem sehe ich darin, dass man in einem Dictinonary vom Value nicht auf den Key schließen kann, oder doch?
Code: Alles auswählen
for key, value in d.iteritems():
print key, '=>' , value
und mit der kurzen for schleife gehst du jeden wert durch und erhälst noch den key zu dem wert
Danke, ich glaub, ich habs hinbekommen:
Code: Alles auswählen
import ConfigParser
import sys
#--- funcions -----------------------------------------------------------------
def write_config(dic):
config = ConfigParser.ConfigParser()
# set parameters
config.add_section('variables') #create a section
for key,value in dic.iteritems():
config.set('variables',key,value) #set the 'name: value
# write to screen
print
print "Save configuration:"
config.write(sys.stdout)
# write to file
new_config = file('example.ini','w') #create file object
config.write(new_config) #write file object
print "Configuration saved.\n"
def read_config(dic):
config = ConfigParser.ConfigParser()
config.read('example.ini')
# feedback to screen
print
print "Load configuration:"
config.write(sys.stdout)
print "Configuration loaded.\n"
try:
for key,value in dic.iteritems():
dic[key] = config.get('variables',key) #set the 'name: value
except:
pass
return dic
#--- main stuff ---------------------------------------------------------------
def main():
# default values
a = 1000
b = 'abcd'
dic = {'a':a,'b':b}
dic = read_config(dic) #read configs form file
print "Dic:", dic
a = dic['a']
b = dic['b']
# here comes main part of the script
a = int(a)
a +=1
print 'a:', a
print 'b:', b
# here ends the main part of the script
dic = {'a':a,'b':b}
write_config(dic)
print "End of script."
if __name__ == '__main__':
main()
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Irgendwie verstehe ich deine read Methode nicht so ganz. Warum sollte man erst das dict übergeben, welches dann aus der ini kommen soll??? Geht es dir darum, das man nur die Werte im dict zurück bekommt, die man vorher angibt?RedSharky hat geschrieben:Danke, ich glaub, ich habs hinbekommen:
Auch verstehe ich den Test nicht so genau. Man möchte doch erstmal Daten speichern und dann später wieder einlesen.
Ich würde es so machen:
Code: Alles auswählen
import sys
from ConfigParser import SafeConfigParser
SECTION = "variables"
def write_ini(config):
ini = SafeConfigParser()
ini.add_section(SECTION)
for key,value in config.iteritems():
ini.set(SECTION, key, value)
new_ini = file('example.ini','w')
ini.write(new_ini)
def read_ini():
ini = SafeConfigParser()
ini.read('example.ini')
config = dict(ini.items(SECTION))
return config
if __name__ == '__main__':
# schreiben
config = {'a':"1000",'b':"FooBar"}
write_ini(config)
# lesen
config = read_ini()
print config
Zum Teil, aber im Normalfall ist das wohl nicht nötig.jens hat geschrieben:Irgendwie verstehe ich deine read Methode nicht so ganz. Warum sollte man erst das dict übergeben, welches dann aus der ini kommen soll??? Geht es dir darum, das man nur die Werte im dict zurück bekommt, die man vorher angibt?
Das ist kein Test, sondern ein Beispiel, das man zu einem sinnvollen Programm erweitern kann. Normalerweise liest man erst die Settings ein, damit man mit seinen eigenen Einstellungen arbeiten kann. Und damit sie beim Beenden nicht verloren gehen, werden sie am Ende gespeichert.jens hat geschrieben:Auch verstehe ich den Test nicht so genau. Man möchte doch erstmal Daten speichern und dann später wieder einlesen.
Danke für deinen Code. Insbesondere:
Das werde ich einarbeiten.jens hat geschrieben:config = dict(ini.items(SECTION))
Du sollstest das niemals verwenden, aber so ginge es z.B.:
Code: Alles auswählen
foo = "bar"
bar = [foo, "bar"]
d = dict((repr(v), k) for k, v in locals().iteritems() if not k.startswith('_'))
print d
print d[repr(foo)] == 'foo'
- mkesper
- User
- Beiträge: 919
- Registriert: Montag 20. November 2006, 15:48
- Wohnort: formerly known as mkallas
- Kontaktdaten:
Aua...
Code: Alles auswählen
>>> import Tkinter as Tk
>>> foo = "bar"
>>> bar = [foo, "bar"]
>>> d = dict((repr(v), k) for k, v in locals().iteritems() if not k.startswith('
_'))
>>> print d
{"'bar'": 'foo', "<module 'Tkinter' from 'C:\\Python25\\lib\\lib-tk\\Tkinter.pyc
'>": 'Tk', "['bar', 'bar']": 'bar', '{"<module \'Tkinter\' from \'C:\\\\Python25
\\\\lib\\\\lib-tk\\\\Tkinter.pyc\'>": \'Tk\'}': 'd'}