Seite 2 von 2

Verfasst: Donnerstag 14. Dezember 2006, 22:23
von sape
Hmm, Shit, hast recht :-[ Eigentlich müsste ich dann in meine INI-Config-Klassen-Wrapper (für ConfigParser. Ist leider immer noch nciht fertig :/) an jeder stelle Implizit nen Test einbauen bzw. an der Ladestelle und der Speicherstelle :/ Hab denn test nämlich im Konstruktor erledigt.

Danke für den __wichtigen__ Hinweiß. So weit hatte ich da nicht gedacht gehabt.

thx lg
sape

Verfasst: Donnerstag 14. Dezember 2006, 22:40
von Leonidas
sape hat geschrieben:Eigentlich müsste ich dann in meine INI-Config-Klassen-Wrapper (für ConfigParser. Ist leider immer noch nciht fertig :/) an jeder stelle Implizit nen Test einbauen bzw. an der Ladestelle und der Speicherstelle :/
Nein, du brauchst keine impliziten Tests (geht auch gar nicht, weil Tests explizit sind) sondern explizite Fehlerbehandlungsmaßnahmen wenn die impliziten Exceptions hochkommen, wenn du auf Pfade zugreifst die es nicht gibt.

Verfasst: Donnerstag 14. Dezember 2006, 23:05
von sape
Nein, du brauchst keine impliziten Tests (geht auch gar nicht, weil Tests explizit sind) sondern explizite Fehlerbehandlungsmaßnahmen wenn die impliziten Exceptions hochkommen, wenn du auf Pfade zugreifst die es nicht gibt.

Code: Alles auswählen

class Config(object):
    def __init__( [...] ):
        try:
            self._ini = [...] # ini laden
        except [...], err:
            raise IOError(2, "Der angegeben Pfad existiert nicht", path)

    [...]
    
    def write(): #ini schreiben
        try:
            [...]
        except [...], err:
            raise IOError(2, "Der angegeben Pfad existiert nicht", path)

    [...]
oder

Code: Alles auswählen

class Config(object):
    def __init__([...]):
    path = os.path.split(filename)[0]
    if not os.path.exists(path):
        raise IOError(2, "Der angegeben Pfad existiert nicht", path)
    self.filename = filename
    
    self._ini = [...] # ini laden

    def write(): #ini schreiben
         if not os.path.exists(self.filename:
             raise IOError(2, "Der angegeben Pfad existiert nicht", path)
         
        # speichern

    [...]
Erstes ist natürlich zu bevorzugen...


Ich ahtte vorher nur eine Überprüfung im Konstruktor, like this

Code: Alles auswählen

class Config(object):
    def __init__([...]):
    path = os.path.split(filename)[0]
    if not os.path.exists(path):
        raise IOError(2, "Der angegeben Pfad existiert nicht", path)
    self.filename = filename
[...]
das ist aber im Konstruktor so notwendig(!), weil ConfigParser bei nicht existent keine Exception wirft ;)

Code: Alles auswählen

class Config(object):
    def __init__(self, filename, ini_content): 
        self._ini = SafeConfigParser()
        self._ini.read(filename) # Wirft keine Exception!
        self._ini_content = ini_content
        self.warning_msgs = []
        
        path = os.path.split(filename)[0]
        if not os.path.exists(path):
            raise IOError(2, "Der angegeben Pfad existiert nicht", path)
        self._filename = filename
        
        self._create_ini_file()
Der `wirte()`Teil wurde vorhin von mir nach den ersten beispiel geändert -> Also `f = file...` in `Try: Except`

lg

Verfasst: Donnerstag 14. Dezember 2006, 23:18
von BlackJack
Aber wenn `ConfigParser` sowieso schon eine Ausnahme auslöst, warum machst Du das dann vorher selbst?

Verfasst: Donnerstag 14. Dezember 2006, 23:22
von sape
kA. Bei mir wirft er keine Exception wenn die INI nicht existiert. Muss ich nacher noch mal testen.

lg

Verfasst: Donnerstag 14. Dezember 2006, 23:47
von BlackJack
Argh. Hab mich verlesen. `ConfigParser` löst keine Ausnahme aus. Das ist auch dokumentiert und hat den Sinn, dass man ganz einfach mehrere Dateien angeben kann, z.B. `/etc/spam.ini`, `~/.spam.ini` und `./spam.ini`, so dass diese Dateien gelesen werden, wenn sie existieren und nichts passiert, wenn sie nicht existieren.

Verfasst: Freitag 15. Dezember 2006, 01:13
von sape
Ah, deshalb macht das der `ConfigParser` nicht. Stimmt das ist natürlich sinnvoll und sollte man dann auch so beleasen.

Aber in meinen "Wrapper" brauche ich das schon, weil ich von eine existierenden "festen" (...\Dokumente und Einstellungen\DerAngemeldeteBenutzer\Lokale Einstellungen\Anwendungsdaten\MyApp) Verzeichnis ausgehe in den die INI-Datei angelegt bzw. gelesen wird (für meine Späteren wxPython Programme)

Naja, merke aber noch das die Klasse von mir nicht 100%ig Schlüssig ist. Werde Später mal eine Rohfassung in einen neune Thread posten. Vielleicht fällt euch ncoh was ein was man daran verbessern könnte.

lg

Verfasst: Freitag 15. Dezember 2006, 08:02
von Nirven
Danke für die Antworten, ich schachtel das dann mal in den drei Funktionen in "try - except" und teste es auch entsprechend.

Zu der Frage weiter oben wegen Planung: So genau wie durch die Unittests nötig habe ich bisher noch nie geplant, meistens etwas überlegt und dann angefangen zu schreiben. Mal sehen, wie das eigentliche schreiben ist, wenn ich vorher schon genau weiß, was rauskommen soll :)