`assert` - warum?

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.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Leonidas hat geschrieben:oder der Assert-Code wird sehr oft ausgeführt.
Oh :shock: Hmm, wie schon geschrieben rede ich hier von einem Parser. Da kannst du dir ja vorstellen wie oft verschiedene Bereiche ausgeführt werden und zwar _sehr_ oft.

So sieht z.B. der Bereich, im `AstGenerator` aus der für die Funktions-/Klassendefinition zuständig ist:
http://paste.pocoo.org/show/501/

Wie gesagt, die Asserts sind für mich an diesen stellen Überlebenswichtig, um mich darauf hinzuweisen, wo eventuell noch was fehlt bzw. was ich nicht mitberücksichtigt habe zu Implementieren!

Wie ich schon geschrieben habe, sind alle Abschnitte (_add2node__XYZ) "irgendwie auch voneinander abhängig". Schlecht zu beschrieben, ohne näher auszuholen (könnte ich zwar jetzt mit einem Konkreten Beispiel machen (wo ncoh was fehlt) aber das würde den Rahmen hier sprengen.

Ich mache, wenn das Modul "ast.py" fertig ist, sowieso einen thread auf (PyMetric und PySource2UML).

Die runfunktion sieht so aus:
http://paste.pocoo.org/show/502/


Was ist nun für mich die Konsequenz mit den asserts die ja 1K mal aufgerufen werden? :? Doch auskommentieren oder?
EDIT:
-O ist keine Option, weil unter windows die Zeile #!/usr/bin/python -O nicht ausgewertet wird.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

...um noch einen drauf zu setzen.

Hier habe ich ein Codebeispiel, das ziemlich gut demonstriert, wofür *ich* ``assert`` meistens einsetze -- um Parameter auf Gültigkeit zu überprüfen. In diesem Beispiel (welches aus einer Klasse heraus gerissen wurde und deshalb auch auf Methoden zugreift, die nicht im Beispiel enthalten sind!) wird eine XML-Datei erstellt. Falls ein falscher Wert als Parameter übergeben wird, würde mein Programm zwar weiterhin korrekt funktionieren -- aber das Programm, dem die XML-Datei übergeben wird -- würde mir einen Kropf an den Hals wünschen. :-) Die Werte die als Parameter übergeben werden, werden nicht vom Benutzer übergeben, sondern vom Programmierer des Client-Programms. Ich fange also mögliche Programmierfehler per ``assert`` ab, um den Programmierer des Clientprogramms (das bin leider auch ich) frühzeitig auf falsch übergebene Parameter hinzuweisen.

Zur Erklärung der Methode:
In Zeile 65 ``(root, short_filename) = self._get_xml_base()`` wird bereits der Header der XML-Datei generiert. Der Rest des Codes fügt XML-Tags (nach Bedarf) hinzu. Die ``assert``-Anweisungen dienen zum Prüfen der übergebenen Parameter.
In Zeile 159 übergebe ich den XML-Root an eine Methode um daraus gültiges XML zu generieren und in eine Datei zu schreiben.
``et`` kommt von ``from elementtree import ElementTree as et``.

http://paste.pocoo.org/show/504/

Wenn jemand einen Fehler entdeckt --> bitte melden.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sape hat geschrieben:Was ist nun für mich die Konsequenz mit den asserts die ja 1K mal aufgerufen werden? :? Doch auskommentieren oder?
Profiler anwerfen. Übrigens ist assert ein Keyword und keine Funktion, daher kannst du die Klammern weglassen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hier aml ein Screenshot von dem kleinen Tool mit dem ich überprüfen kann, ob alle "Abdrücke" im Python Sourcefile auch in den richtigen Knotenpunkten sind. Seit dem ich das für meine `AstGenerator` geschrieben hab, habe ich sehr viele Bugs beheben können :D BTW: Die grauen kästchen kann man mit einem Rechstklick auf einer Node öffne :D

Bild
Daraufklicken um zu einer vergrößerten Ansicht zu gelangen
BlackJack

sape hat geschrieben:
Leonidas hat geschrieben:oder der Assert-Code wird sehr oft ausgeführt.
Oh :shock: Hmm, wie schon geschrieben rede ich hier von einem Parser. Da kannst du dir ja vorstellen wie oft verschiedene Bereiche ausgeführt werden und zwar _sehr_ oft.
Das kommt darauf an was *sehr* oft bedeutet. Ein paar tausend mal muss nicht oft sein, auch ein paar zehntausend mal nicht. Wenn man nicht gerade einen universellen Parser schreibt, der O(n^3) Zeit benötigt, mit `n` der Anzahl der Eingabesymbole, dann sollten ein paar einfache ``assert``s pro verarbeitetem Symbol kein Problem sein.
Was ist nun für mich die Konsequenz mit den asserts die ja 1K mal aufgerufen werden? :? Doch auskommentieren oder?
1K ist grundsätzlich für einfache Prüfungen IMHO nicht viel. Du kannst den Code ja mal mit und ohne ``-O`` laufen lassen und vergleichen, ob sich das überhaupt bemerkbar macht. Und wenn es sich bemerkbar macht, dann musst Du entscheiden ob der Gewinn in der Geschwindigkeit gross genug ist, um auf die ``assert``s zu verzichten. Dann bleibt noch die Frage auf welche man verzichten möchte. Es gibt sicher welche, die wichtiger sind als andere und es gibt auch welche, die mehr zur Laufzeit beitragen als andere. Eins das das Programm 0.00001% langsamer macht muss man nicht unbedingt rauswerfen, andererseits kann ein Zeitfresser auch wichtig genug sein um ihn zu behalten.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Profiler anwerfen. Übrigens ist assert ein Keyword und keine Funktion, daher kannst du die Klammern weglassen.
Thx, werde ich machen bei den ``assert``s. Welchen Profiler kannst du empfehlen?

Danke Gerold. Um so mehr ich Beispiel über ``assert`` sehe und selber mit arbeite, überzeugt mich das immer mehr 8)

Jack, danke für die Erklärung. Das hilft mir weiter. :) Ich werde darüber nachdenken und nochmal alles durchgehen und auch ein par Benchmarks machen.

thx & lg
sape
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sape hat geschrieben:Welchen Profiler kannst du empfehlen?
Die Python Profiler. Musst nur überlegen, ob du hotshot oder cProfile nimmst, aber dazu steht in der Dokumentation alles nötige drin. Ich kann dich beruhigen, sie sind einfach zu nutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten