Danke euch für die ausführliche Antwort. Das hilft mir weiter. Ich werde dann mal probieren einen Groben Ablauf zu skizzieren und je nachdem das Ganze immer wider anpassen/aktuell halte.
lg
Wie am besten Code aufbauen der sich debugen lässt?
Ne hast natürlich recht, aber da bin ich einfach nur von einer Unabhängigen Funktion ausgegangen die man durchaus auch zum Test gebrauchen kann. `is_exist_path` soll True zurückgeben wenn der Pfade existiert und False wenn nicht. Die soll also auch für andere Bereiche gebraucht werden und nicht nur für `A()` und `B()` und soll keinsefalls eine Exception auslösen wenn False ist.Leonidas hat geschrieben:Warum mift die Check-Funktion nicht selbst die Exception? So hast du entweder den gleichen Exception-Werf-Code in jeder aufrufenden Funktion oder wirst beim gleichen Fehler drei verschiedene Exceptions, was IMO keinen Sinn macht, da der Fahler ja gleich bleibt.sape hat geschrieben:Code: Alles auswählen
def is_exist_path(string_): pass def A(string_): if not is_exist_path(string_): raise irgend_eine_exception # Alles i.O. Normal weitermachen. def B(string_): if not is_exist_path(string_): raise irgend_eine_exception # Alles i.O. Normal weitermachen. [...]
[...]
Aber du hast mich gerade auf ein Idee gebracht.
Code: Alles auswählen
def is_exist_path(path): # Soll für jede Funktion benutzbar sein
if os.path.exists(path):
return True
else:
return False
# Testfunktion für `A()` und `B()`. Ist private!
def _check_is_data_valid(string_)
if not is_exist_path(string_):
raise irgend_eine_exception
def A(string_):
_check_is_data_valid(string_)
# Alles i.O. Normal weitermachen.
def B(string_):
_check_is_data_valid(string_)
# Alles i.O. Normal weitermachen.
[...]
BTW: Dient nur als Beispiel. Um einen Pfad zu testen würde ich gleich `os.path.exists` nutzen.
Gerade bei diesem speziellen Beispiel kannst Du Dir alle Tests sparen. Nachdem getestet wurde und bevor mit dem Pfad etwas getan wird, kann der von einem anderen Programm gelöscht werden. Also musst Du sowieso mit Ausnahmen rechnen und die entsprechend behandeln.
Stimmt schon, obwohl die Wahrscheinlichkeit wirklich gering ist, das gerade in der selben Sekunde der Pfad bzw. Ordner von einem anderen Programm gelöscht wurde. Ich meine das ist Millisekunden bereich zwischen der Überprüfung und dann den Benutzen des Pfades. Ich denke die Wahrscheinlichkeit liegt im gleichen bereich wie das mit denn PIDs bei Linux oder?
Das kommt ganz darauf an um was für Pfade es sich handelt. Im `/tmp/`-Verzeichnis ist die Wahrscheinlichkeit sicher höher.sape hat geschrieben:Stimmt schon, obwohl die Wahrscheinlichkeit wirklich gering ist, das gerade in der selben Sekunde der Pfad bzw. Ordner von einem anderen Programm gelöscht wurde. Ich meine das ist Millisekunden bereich zwischen der Überprüfung und dann den Benutzen des Pfades. Ich denke die Wahrscheinlichkeit liegt im gleichen bereich wie das mit denn PIDs bei Linux oder?
Aber das ändert nichts daran, dass so ein Test implizit immer gemacht wird, wenn man mit einem Pfad eine Datei öffnen will. Wenn man ihn vorher explizit macht, dann wird er letztendlich zweimal ausgeführt.
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
Danke für den __wichtigen__ Hinweiß. So weit hatte ich da nicht gedacht gehabt.
thx lg
sape
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.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 :/
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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)
[...]
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
[...]
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
[...]
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()
lg
Aber wenn `ConfigParser` sowieso schon eine Ausnahme auslöst, warum machst Du das dann vorher selbst?
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.
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
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
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
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