Bezeichnung einer Variable

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Samstag 29. März 2008, 19:46

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?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Samstag 29. März 2008, 20:45

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?
HWM-Rocker
User
Beiträge: 3
Registriert: Samstag 29. März 2008, 18:15

Samstag 29. März 2008, 21:04

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.

Code: Alles auswählen

meineVars = locals()
meineVars['a']=14
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
HWM-Rocker
User
Beiträge: 3
Registriert: Samstag 29. März 2008, 18:15

Samstag 29. März 2008, 21:11

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
d ist ein dict
und mit der kurzen for schleife gehst du jeden wert durch und erhälst noch den key zu dem wert
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Samstag 29. März 2008, 21:17

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()
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 29. März 2008, 22:29

RedSharky hat geschrieben:Danke, ich glaub, ich habs hinbekommen:
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?
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
Es gibt sowieso Probleme, wenn du Zahlen "speichern" willst. Denn die kommen als String wieder aus der ini zurück. Der SafeConfigParser wirft auch einen Traceback schon beim speichern.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Sonntag 30. März 2008, 08:11

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?
Zum Teil, aber im Normalfall ist das wohl nicht nötig.
jens hat geschrieben:Auch verstehe ich den Test nicht so genau. Man möchte doch erstmal Daten speichern und dann später wieder einlesen.
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.

Danke für deinen Code. Insbesondere:
jens hat geschrieben:config = dict(ini.items(SECTION))
Das werde ich einarbeiten.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Sonntag 30. März 2008, 21:41

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'
:D
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Montag 31. März 2008, 12:34

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'}
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 31. März 2008, 12:42

Naja, es tut exakt, was es soll :D
Antworten