0%

Wenn die Außenwelt Probleme macht · Übung

Den Grenzfall in pdb untersuchen

Der Fall ist jetzt stabil: Menge 4, Schwellenwert 4, ein Artikel, der erhalten bleiben sollte und entfernt wurde. Du könntest den Vergleich genau ansehen und die Ursache wahrscheinlich erraten. Der Debugger bietet mehr als eine Vermutung: Er hält den echten Lauf an der echten Zeile an, mit den echten Werten direkt vor dir.

Starte das Programm unter Pythons eingebautem Debugger:

python -m pdb catalog.py catalog.csv selected.json --minimum-quantity 4

Du erhältst eine Eingabeaufforderung (Pdb) statt eines Ergebnisses. Das Programm ist geladen, aber noch nicht gelaufen.

An der entscheidenden Zeile anhalten

Du möchtest innerhalb von select_items am Vergleich anhalten, der entscheidet, ob ein Artikel erhalten bleibt. Lass pdb die Stelle finden, statt die Zeilen selbst zu zählen:

b select_items
c

b select_items setzt einen Haltepunkt für den nächsten Aufruf dieser Funktion. c setzt die Ausführung fort, bis etwas sie anhält. Die Ausführung stoppt am Anfang der Funktion.

Betrachte jetzt den Quellcode um dich herum und setze einen Haltepunkt auf den Vergleich selbst:

l

l zeigt die Zeilen in der Nähe der angehaltenen Stelle an; ein Pfeil markiert die aktuelle Zeile. Finde die Zeile mit item["quantity"], merke dir ihre Nummer, setze dort einen Haltepunkt und fahre fort:

b 42
c

Verwende die Nummer, die l dir tatsächlich gezeigt hat. Zeilennummern hängen davon ab, wie du die früheren Kapitel geschrieben hast. Deine müssen daher nicht mit denen anderer übereinstimmen.

Vor dem nächsten Schritt hinsehen

Du hältst jetzt am Vergleich an und hast einen Artikel vor dir. Frage nach den beiden Werten, die über ihn entscheiden:

p item["quantity"]
p minimum_quantity

Beide geben 4 aus. Das ist also der Gleichheitsfall, den der eigene Hilfetext der Option zu behalten verspricht.

Führe jetzt nur diese Zeile aus und beobachte, wo du landest:

n

n führt die aktuelle Zeile aus und hält an der nächsten Zeile in dieser Funktion an. Beobachte den Verlauf: Das Anhängen wird übersprungen. Der Artikel mit Menge 4 wurde bei einem Schwellenwert von 4 entfernt.

Das ist die gesamte Diagnose. Es lohnt sich, sie genau zu benennen, denn eine ungenaue Diagnose führt zu einer ungenauen Korrektur. Der Vergleich verwendet >, was Gleichheit ausschließt. Die Schnittstelle sagt „at least“, also „mindestens“, und schließt Gleichheit ein. Ein Zeichen im Code widerspricht einem Wort des Vertrags.

Verlasse den Debugger mit q.

Korrigieren und bestätigen

Öffne catalog.py mit nano, ändere diesen Vergleich von > zu >=, speichere und führe den ursprünglichen Befehl erneut aus:

python catalog.py catalog.csv selected.json --minimum-quantity 4
cat selected.json

Er sollte jetzt zwei Artikel melden, und selected.json sollte BK-101 und PN-330 in dieser Reihenfolge enthalten.

Bleibe ehrlich darüber, was du gerade belegt hast. Du hast einen Fall reproduziert, den verantwortlichen Ausdruck gefunden und beobachtet, wie die Korrektur diesen Fall verändert. Du hast nicht belegt, dass der Rest des Programms richtig ist oder dass eine spätere Änderung den Fehler nicht zurückbringt. Das wären echte Aussagen, die Tests statt eines Debuggers brauchen. Kapitel 10 handelt davon, diese Tests zu schreiben.

Das Werkzeug wieder entfernen

Ein Haltepunkt ist ein Hilfsmittel. Er gehört in eine Untersuchung, nicht in die Datei, die du jemand anderem übergibst.

Falls du in catalog.py mit breakpoint() oder pdb.set_trace() experimentiert hast, entferne das vor dem Einreichen. Sonst stoppt ein gewöhnlicher Benutzer an einer Debugger-Eingabeaufforderung, die er nicht angefordert hat und vielleicht nicht verlassen kann.

Drücke Check my work, sobald der korrigierte Befehl und selected.json übereinstimmen.

Wenn die Anzahl noch falsch ist, führe am Haltepunkt erneut p minimum_quantity aus. Bitte Monty, den Unterschied zwischen > und >= an einem Grenzwert zu erklären, wenn der Gleichheitsfall noch unklar ist.

Aufgabe

Untersuche den bereitgestellten Gleichheitsfall mit pdb. Korrigiere anschließend select_items so, dass eine Menge gleich minimum_quantity eingeschlossen wird. Führe die CLI aus, um selected.json mit Schwellenwert 4 neu zu erstellen, und entferne alle vorübergehenden Debugger-Aufrufe.

Die Prüfung untersucht Quellcodeverhalten und Ergebnisdatei, nicht den Debugger-Verlauf.