Wie man findet, wo eine Funktion steckt
Eine Codebasis ist der gesamte Code eines Programms. Am ersten Arbeitstag bekommen Sie eine, die andere geschrieben haben, mit Tausenden Zeilen und ohne Karte.
Niemand liest alles. Man lernt, eine Frage zu stellen, nach der Antwort zu suchen und von dort den Aufrufen zu folgen.
Am Ende dieser Lektion
Notiz
Ich kann in fremdem Code finden, wo eine Funktion steckt, und einem Aufruf von Datei zu Datei folgen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Codebasis | alle Dateien mit Code, die ein Programm bilden |
| Einstiegspunkt | die Datei oder Funktion, in der ein Programm zu laufen beginnt |
| Suche | in allen Dateien nach einem Wort schauen, mit einem Werkzeug wie grep |
| Aufrufer | eine Codezeile, die eine Funktion benutzt |
| Aufrufkette | die Funktionen, zu denen ein Aufruf nacheinander führt |
| Test als Dokumentation | ein Test, der im Code zeigt, was eine Funktion verspricht |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Mit einer Frage beginnen, nicht mit einer Datei
Öffnen Sie nicht die erste Datei und lesen Sie nach unten. Fragen Sie etwas Kleines: Wo wird der Gutschein-Rabatt berechnet?
Sehen Sie zuerst die Form der Ordner an. Starten Sie das Programm. Suchen Sie dann nach einem Wort, das auf dem Bildschirm steht.
Legen Sie zuerst das Projekt an. Ein versteckter Cache-Ordner würde die Suche stören, darum schaltet der erste Run ihn ab.
Python keine Cache-Ordner schreiben lassen
export PYTHONDONTWRITEBYTECODE=1Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die beiden Ordner anlegen
mkdir -p ~/codelesen/laden ~/codelesen/testsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
In das Projekt wechseln
cd ~/codelesenHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Preisliste schreiben
printf 'PREISE = {"tee": 250, "tasse": 899, "buch": 1200}\n\n\ndef stueckpreis(code):\n return PREISE[code]\n' > laden/preise.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Gutscheine schreiben
printf 'GUTSCHEINE = {"SPAR10": 10, "HALB": 50}\n\n\ndef rabatt_prozent(code):\n return GUTSCHEINE.get(code, 0)\n' > laden/rabatte.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Bestellsumme schreiben
printf 'from laden.preise import stueckpreis\nfrom laden.rabatte import rabatt_prozent\n\n\ndef bestellsumme(positionen, gutschein=None):\n summe = 0\n for code, anzahl in positionen:\n summe = summe + stueckpreis(code) * anzahl\n prozent = rabatt_prozent(gutschein)\n return summe - summe * prozent // 100\n' > laden/bestellung.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Startbefehl schreiben
printf 'import sys\nfrom laden.bestellung import bestellsumme\n\n\ndef haupt(argumente):\n positionen = [("tee", 2), ("tasse", 1)]\n gutschein = argumente[0] if argumente else None\n print(bestellsumme(positionen, gutschein))\n\n\nhaupt(sys.argv[1:])\n' > laden/start.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Tests schreiben
printf 'import unittest\nfrom laden.bestellung import bestellsumme\n\n\nclass BestellungTest(unittest.TestCase):\n def test_ohne_gutschein(self):\n self.assertEqual(bestellsumme([("tee", 2)]), 500)\n\n def test_spar10(self):\n self.assertEqual(bestellsumme([("tee", 2)], "SPAR10"), 450)\n' > tests/test_bestellung.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Form des Projekts ansehen
ls -RHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Mit einem Gutschein starten
python3 -m laden.start SPAR10Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Nach einem sichtbaren Wort suchen
Das Programm druckte 1260. Der Gutschein hieß SPAR10, und dieses Wort muss irgendwo stehen. grep -rn durchsucht alle Dateien unter den genannten Ordnern und druckt Datei, Zeilennummer und Zeile.
Ein Name auf dem Bildschirm ist der beste Weg in Code, den Sie nicht kennen.
Nach dem Gutscheinnamen suchen
grep -rn "SPAR10" laden testsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Dem Aufruf zum nächsten Ort folgen
Die Suche fand eine Tabelle von Gutscheinen in rabatte.py. Eine Tabelle tut allein nichts, also fragen Sie weiter: Wer benutzt sie?
Suchen Sie nach der Funktion, die die Tabelle liest. Eine Zeile definiert sie, eine importiert sie und eine ruft sie auf. Am Aufruf erreicht der Rabatt die Bestellung.
Jede Verwendung der Funktion finden
grep -rn "rabatt_prozent" ladenHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Beispiel: die Aufrufkette eines Befehls
| Schritt | Datei und Funktion | Was geschieht |
|---|---|---|
| 1 | laden/start.py, haupt | Der Einstiegspunkt liest den Gutschein von der Kommandozeile |
| 2 | laden/bestellung.py, bestellsumme | Addiert die Preise und fragt dann nach dem Rabatt |
| 3 | laden/preise.py, stueckpreis | Liefert den Preis eines Artikels |
| 4 | laden/rabatte.py, rabatt_prozent | Schlägt den Gutschein nach oder liefert 0 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Tests lesen, um Versprechen zu lernen
Ein guter Test sagt, was eine Funktion tun soll, mit echten Eingaben und den Antworten. Er ist die einzige Dokumentation, die nicht veralten kann, denn er scheitert, wenn sie es tut.
Listen Sie die Testnamen auf und lassen Sie sie laufen. Bestehen sie, ist wahr, was Sie gelesen haben.
Die Tests auflisten
grep -n "def test" tests/test_bestellung.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Tests starten
python3 -m unittest discover -s tests 2>&1 | grep -E "^(OK|FAILED)"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele lesen jede Datei von oben und hoffen, zuerst alles zu verstehen. Das dauert Tage, und das meiste betrifft Ihre Frage nicht. Stellen Sie eine Frage, suchen Sie, folgen Sie dem Aufruf und hören Sie auf, wenn Sie antworten können.
Weiterdenken: ein größeres Projekt
Wählen Sie ein Projekt, das Sie benutzen und dessen Quelltext auf Ihrem Rechner liegt. Wählen Sie eine Sache, die es tut, etwa wie es eine Einstellungsdatei liest.
Notieren Sie die Frage, das gesuchte Wort und die Kette der Dateien, der Sie folgten. Wie viele Schritte waren es?