Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Python

Python debuggen meesteren: efficiënte technieken & best practices

Python debuggen meesteren: efficiënte technieken & best practices

Het debuggen van Python-code komt voor velen van ons neer op het toevoegen van print-statements en proberen te redeneren wat er aan de hand is op basis van de output. Het is niet ideaal, maar om een of andere reden willen mensen de Python debugger niet aanraken.

Als u een van die mensen bent die print gebruiken voor debuggen, oordeel ik u niet. Python leren is moeilijk. Programmeren is moeilijk. Het leven is moeilijk. Ik begrijp dat het leren van nog een ding vermoeiend lijkt als u al worstelt. En die print-statement toevoegen aan uw code… het is gewoon makkelijker. Een kleine bekentenis: ik doe het nog steeds de hele tijd. Het is niet zo erg als sommigen het laten lijken.

Dat gezegd hebbende, ga ik u een klein trucje leren dat net zo makkelijk is als print-statements toevoegen aan uw code. Echter, deze truc geeft u oneindige debug-krachten en stelt u in staat de wereld te overwinnen, mocht u dat nodig hebben.

Een Python debugger-breakpoint instellen

U heeft geen IDE nodig om uw code correct te debuggen. Deze truc werkt altijd, zelfs in de eenvoudigste editor, en zelfs in Jupyter Notebooks.

De truc komt neer op dit: een zogenaamde breakpoint instellen met de instructie breakpoint(). U kunt het in uw code invoegen, ongeacht welke editor of IDE u gebruikt, op het punt waar u normaal die vervelende print-statement zou zetten.

Wat er gebeurt als u dat doet? Laten we ontdekken! Maak een simpel programma, zoals het onderstaande:

def add_two(x):
    return x + 2

for i in range(1, 10):
    a = add_two(i)
    breakpoint()
    print(a)

Wanneer u dit uitvoert, en het maakt niet uit of u dat doet in de REPL, vanaf de commandoregel, of in uw IDE, duikt u in de Python debugger genaamd PDB. Maar wat nu?

De Python debugger gebruiken

Wanneer ik het kleine programma hierboven start, gebeurt dit:

$ python3 breakpointing.py
> /home/erik/breakpointing.py(7)<module>()
-> print(a)
(Pdb)_

Er zijn een paar dingen te zien:

  • Het toont het huidige bestand dat gestart werd (breakpointing.py)
  • Daarna toont het de volgende opdracht die zou worden uitgevoerd, maar werd onderbroken door de aanroep naar breakpoint().
  • En ten slotte zien we de pdb-prompt, die wacht op onze invoer.

De Python debugger is eigenlijk een volledig functionerende Python-shell, net als de REPL.

Op dit punt kunnen we de huidige omgeving inspecteren. Laten we kijken wat de waarde van a nu is:

(Pdb) print(a)
3
(Pdb) print(i)
1

In plaats van print, kunt u ook het pdb-specifieke commando p gebruiken, zoals dit:

(Pdb) p a
3
(Pdb) p i
1

De volgende regel uitvoeren

Wat als we de volgende regel code willen uitvoeren? Er zijn twee opties:

  • Met s of step, voert u de huidige regel uit. De debugger stopt bij de eerst mogelijke gelegenheid daarna.
  • Met n of next, voert u de huidige regel ook uit, maar nu gaat de debugger door tot de volgende regel van de huidige functie bereikt is.

Om dit duidelijker te maken: step gaat met plezier in een functieaanroep en breekt binnen in die functie. In tegenstelling, next voert de functie uit tot deze retourneert, en breekt op de volgende regel.

Andere debuggers en IDE's noemen dit ook 'step into' (in plaats van step) en 'step over' (in plaats van next).

Laten we deze twee nu gebruiken:

$ python3 breakpointing.py
-> print(a)
(Pdb) s
3
-> for i in range(1, 10):
(Pdb) s
-> a = add_two(i)
(Pdb) n
-> breakpoint()
(Pdb) n
-> print(a)
(Pdb) n
4
-> for i in range(1, 10):
(Pdb) s
-> a = add_two(i)
(Pdb) s
--Call--
-> def add_two(x):
(Pdb) s
-> return x + 2
(Pdb) s
--Return--
5
-> return x + 2
(Pdb) s
-> breakpoint()
(Pdb)

Zoals u ziet, steppen we eerst over de aanroep naar add_two met n. De tweede keer stappen we in de functie met s.

Python debugger-commando's

Er zijn meer commando's die u zelf kunt uitproberen. Ik zal ze niet allemaal opsommen, alleen de meest nuttige:

  • h (help): print alle beschikbare commando's. Neemt ook een argument, bijv. h c vertelt wat het c commando doet
  • c (continue): begint met draaien tot de volgende breakpoint
  • l (list): toont de broncode rond de huidige regel
  • p: print het resultaat van de volgende expressie. U kunt dit gebruiken in plaats van print() aan te roepen
  • pp: pretty print, nuttig voor het printen van datastructuren zoals dictionaries
  • restart: herstart het huidige programma

Voor de complete documentatie, ga naar de Python debugger-pagina, waar alle commando's worden vermeld.

Blijven leren

Hoewel dit super handig kan zijn, loont het om in de debugger van uw IDE te duiken. Als u een VSCode-gebruiker bent, schreef ik een tutorial over hoe Python-code in VSCode te debuggen.

Python debuggen meesteren: efficiënte technieken & best practices

Python

  1. Onderhoud Stroomlijnen Om FabrieksEfficiëntie Te Boosten
  2. PCB-ontwerp meesteren: essentiële tips & best practices voor ingenieurs
  3. Productie versnellen: Hoe prototyping uw productieproces verbetert
  4. 5 Bewezen Strategieën voor Betere Kwaliteit Platen Metaal Onderdelen
  5. 3 Bewezen Strategieën Om Je Industriële Apparatuuronderhoudsplan Te Verbeteren
  6. Maximaliseer winst met Ford's uitgebreide connected fleet management
  7. Python I/O en Module Imports onder de knie krijgen: Een praktische gids
  8. Python print()-functie: Praktische handleiding met voorbeelden
  9. Python-stringoperaties beheersen: Replace, Join, Split, Reverse en case-conversie
  10. Python time.sleep(): Hoe vertraging toe te voegen aan je code (voorbeeld)
  11. Python print zonder newline: de end-parameter & andere technieken beheersen