ConfigParser: Wie setzt man Default-Werte?

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.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

ConfigParser: Wie setzt man Default-Werte?

Beitragvon api » Montag 19. Januar 2009, 16:30

Hallo zusammen,

ich möchte eigentlich nur mittels des ConfigParser's eine INI-Datei einlesen - allerdings muss gewährleistet sein, dass fehlende Keys bzw. Sections per Default hinterlegt sind.

Mein Code sieht also zB so aus:
INI-Datei
[CONF]
LOG_LEVEL=1

Python-Programm:

Code: Alles auswählen

import ConfigParser

config = ConfigParser.ConfigParser()
config.read(['test.conf'])
print config.get('CONF', 'LOG_LEVEL')
print config.get('CONF', 'ACT_VALUE')


Der Key 'ACT_VALUE' befindet sich nun gar nicht im INI-File. Gibt es eine Möglichkeit im Python-Programm Defaults für so etwas zu hinterlegen?

CU,
API
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Beitragvon querdenker » Montag 19. Januar 2009, 16:35

Vorschlag: Wert aus dem Config-File abfragen -> wenn der nicht da ist, sollte es eine Exception geben. Auf die kannst du dann mit einem config.set(...) reagieren.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Beitragvon api » Montag 19. Januar 2009, 16:44

Hallo querdenker,

dass mit ner Exception abzufangen wäre zwar ne Möglichkeit, aber da ich zig Keys/Values in dieser INI-Datei stehen habe (Beispiel ist nur ein Auszug), müsste ich das dann für jeden Wert seperat machen.

Gibt es da noch andere Möglichkeiten?

CU,
API
DasIch
User
Beiträge: 2405
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beitragvon DasIch » Montag 19. Januar 2009, 16:56

Code: Alles auswählen

import ConfigParser as cfgp
class Config(cfgp.ConfigParser):
    def get(self, section, option, default=None, **kwargs):
        if default is None:
            return cfgp.ConfigParser.get(self, section, option, **kwargs)
        try:
            return cfgp.ConfigParser.get(self, section, option, **kwargs)
        except cfgp.NoOptionError:
            return default

Du könntest auch ein dict nehmen und dort den Standard Wert nachschlagen.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Montag 19. Januar 2009, 16:59

Wenn ich das richtig sehe unterstützt ConfigObj von sich aus Defaults. Und hat auch ein paar andere Vorteile gegenüber configparser.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Beitragvon helduel » Montag 19. Januar 2009, 17:01

Moin,

nicht so kompliziert, bitte. In der Doku zum ConfigParser steht, wie man default-Werte festlegt:

Code: Alles auswählen

import ConfigParser

# New instance with 'bar' and 'baz' defaulting to 'Life' and 'hard' each
config = ConfigParser.SafeConfigParser({'bar': 'Life', 'baz': 'hard'})
config.read('example.cfg')

print config.get('Section1', 'foo') # -> "Python is fun!"
config.remove_option('Section1', 'bar')
config.remove_option('Section1', 'baz')
print config.get('Section1', 'foo') # -> "Life is hard!"


Gruß,
Manuel
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Beitragvon api » Montag 19. Januar 2009, 17:30

Hallo Manuel,

wenn ich bei meinem obigen Beispiel bleibe, bekomme ich mit folgendem Python-Code diese Fehlermeldung:

Code: Alles auswählen

import ConfigParser

config = ConfigParser.SafeConfigParser({'ACT_VALUE':'100'})
config.read(['test.conf'])
print config.get('CONF', 'LOG_LEVEL')
print config.get('CONF', 'ACT_VALUE')

1
Traceback (most recent call last):
  File "tt.py", line 8, in ?
    print config.get('CONF', 'ACT_VALUE')
  File "/usr/sfw/lib/python2.3/ConfigParser.py", line 513, in get
    raise NoOptionError(option, section)
ConfigParser.NoOptionError: No option 'act_value' in section: 'CONF'


Was ist da noch falsch?

CU,
API
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Montag 19. Januar 2009, 17:41

Guck doch mal, was Dir

Code: Alles auswählen

config.defaults()

ausgibt!

Ich wette da findest Du das ACT_VALUE!

So wie ich das verstanden habe, kann man nur default Werte übergeben, die in keiner Section stehen, also global gültig sind! Das ist bei Dir ja nicht der Fall. (Was helduel mal nicht gesagt hat ;-) )

Außer man kann das dict so erweitern, dass man die Section mit angeben kann, etwa:

Code: Alles auswählen

config = ConfigParser.SafeConfigParser({'CONF':{'ACT_VALUE':'100'}})
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Beitragvon api » Montag 19. Januar 2009, 17:52

Wenn ich das so erweitere, bekomme ich folgende Ausgabe:

Code: Alles auswählen

import ConfigParser

config = ConfigParser.SafeConfigParser({'CONF':{'ACT_VALUE':'100'}})
config.read(['test.conf'])
print config.get('CONF', 'LOG_LEVEL')
print config.defaults()
print config.get('CONF', 'ACT_VALUE')

{'CONF': {'ACT_VALUE': '100'}}
Traceback (most recent call last):
  File "tt.py", line 9, in ?
    print config.get('CONF', 'ACT_VALUE')
  File "/usr/sfw/lib/python2.3/ConfigParser.py", line 513, in get
    raise NoOptionError(option, section)
ConfigParser.NoOptionError: No option 'act_value' in section: 'CONF'


Die Frage ist jetzt nur, was ich mit dieser Info anfangen kann...

CU,
API
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Montag 19. Januar 2009, 18:05

api hat geschrieben:Die Frage ist jetzt nur, was ich mit dieser Info anfangen kann...

Nicht viel, weil Du meine Mutmaßung einfach so übernommen hast! Probiere es doch einmal ohne das verschachtelete dict!

Code: Alles auswählen

In [5]: config = ConfigParser.SafeConfigParser({'ACT_VALUE':'100'})

In [6]: print config
<ConfigParser.SafeConfigParser instance at 0x912810c>

In [7]: print config.defaults()
{'act_value': '100'}

In [8]: print config.sections()
[]

Schau Dir das einfach an!
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Beitragvon api » Montag 19. Januar 2009, 18:40

Eine wirklich gute Idee!!! :D

Ich habe das jetzt mal folgendermaßen gelöst:

Code: Alles auswählen

import ConfigParser

config = ConfigParser.SafeConfigParser({'ACT_VALUE':'100', 'LOG_LEVEL':'3'})
config.read(['test.conf'])

def SetValue (sv_section, sv_key):

  try:
    value = config.get(sv_section, sv_key)

  except:
    value = config.defaults()[sv_key]

  return value


ActValue = SetValue ('CONF', 'ACT_VALUE')
LogLevel = SetValue ('CONF', 'LOG_LEVEL')

print "ActValue: %s" % ActValue
print "LogLevel: %s" % LogLevel


...und das ergibt...

Code: Alles auswählen

ActValue: 100
LogLevel: 1


Das ist genau das, was ich mir vorgestellt habe... Danke für die Hilfe!! :D

CU,
API
DasIch
User
Beiträge: 2405
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Beitragvon DasIch » Montag 19. Januar 2009, 18:52

Das ist keine Lösung dass ist ein Verbrechen.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Montag 19. Januar 2009, 19:07

Warum benutzt du überhaupt den Abschnitt `CONF' in einer Konfigurationsdatei? Reicht es nicht wenn die schlicht und einfach Top-Level sind?
BlackJack

Beitragvon BlackJack » Dienstag 20. Januar 2009, 08:50

@cofi: Der ConfigParser will zwingend mindestens einen benannten Abschnitt in der Konfigurationsdatei haben.
lunar

Beitragvon lunar » Dienstag 20. Januar 2009, 10:22

Dann wäre ConfigObj vielleicht doch eine Option, da es auch Konfigurationsdateien ohne Abschnitte parsen kann.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder