När du skissar på en funktion men ännu inte har bestämt vad den ska göra kan den tomma kodraden stoppa dig: Python kräver ett indenterat block. pass löser det tillfälligt, men bara om du vill att koden på den platsen inte ska göra någonting just nu.

pass lämnar ett block tomt utan att avbryta programmet
- Fyller ett tomt block när Python kräver en sats.
- Hoppar inte över resten av funktionen eller loopen.
- Skiljer sig från
return,continueochbreak. - Kan dölja fel om det används för att ignorera undantag.
Python kräver en sats även när blocket ska vara tomt
En funktion, klass eller villkorsgren kan inte lämnas utan innehåll. Om du skriver en rubrik och kolon men ingen indenterad sats får du ett syntaxfel. pass fungerar som en tom sats: Python accepterar blocket och fortsätter utan att utföra någon åtgärd där.
def skapa_rapport():
passFunktionen går nu att definiera och anropa, men den skapar ingen rapport. Jag tycker att pass är tydligast när tomheten är avsiktlig eller tillfällig och blocket behöver finnas för att koden ska kunna byggas vidare.
Samma princip fungerar i en klass eller i en gren av ett villkor. Den officiella Python Language Reference beskriver pass som en nulloperation, alltså en sats som inte gör något när den körs.
if användare_är_inloggad:
pass
else:
visa_inloggning()Här händer ingenting i den första grenen. Om avsikten egentligen är att visa en startsida eller hämta användardata finns arbetet fortfarande kvar, även om programmet kör utan syntaxfel.
pass avbryter inte funktionen eller loopen
Namnet kan ge intryck av att Python ska gå vidare förbi resten av blocket. Så fungerar det inte. pass gör ingenting på just den raden, och körningen fortsätter med nästa sats.
for namn in ["Ada", "Bo"]:
pass
print(namn)Loopen skriver ut båda namnen. Om du vill hoppa till nästa varv använder du continue; om du vill avsluta loopen använder du break. Inne i en funktion avslutar return anropet och kan skicka tillbaka ett värde. Det är olika kontrollflöden, inte utbytbara varianter av en tom sats.
| Situation | Vad satsen gör | Välj den när |
|---|---|---|
| En gren ska göra ingenting | pass fortsätter efter satsen | Den tomma grenen är avsiktlig |
| Resten av varvet ska hoppas över | continue börjar nästa varv | Aktuellt objekt inte ska behandlas vidare |
| Loopen ska stoppas | break avslutar närmaste loop | Du har hittat det du letade efter |
| Funktionen ska avslutas | return lämnar funktionsanropet | Funktionen är klar eller ska lämna tillbaka ett resultat |
Den skillnaden är särskilt användbar när ett villkor inne i en loop filtrerar bort vissa poster. Dokumentationen om enkla Python-satser anger att continue går till nästa varv och att break avslutar den närmaste loopen. Välj alltså efter önskat flöde, inte efter vilken sats som råkar få bort syntaxfelet.
En tom undantagshanterare kan svälja felet
Den mest riskabla platsen för pass är ofta ett except-block. Koden nedan fångar ett fel och gör sedan ingenting med det, så programmet kan fortsätta utan att du ser varför inläsningen misslyckades.
try:
pris = int(indata)
except ValueError:
passOm indata exempelvis innehåller text i stället för en siffra skapas ingen användbar variabel för priset. Felet försvinner ur sikte, och en senare rad kan krascha av en helt annan anledning. För ett formulär är det oftast bättre att visa ett begripligt meddelande eller ge värdet ett tydligt standardbeteende.
| Situation | Trolig följd | Gör så här |
|---|---|---|
En funktion har bara pass | Anropet gör ingenting och returnerar implicit None | Markera arbetet som ofärdigt eller implementera funktionen |
pass står i en loop där poster ska filtreras bort | Resten av loopvarvet körs ändå | Använd continue om varvet ska hoppas över |
Ett except-block innehåller pass | Undantaget ignoreras och felet kan bli svårt att hitta | Hantera felet, logga det eller visa ett relevant meddelande |
| En villkorsgren är tom med avsikt | Programmet fortsätter utan åtgärd i grenen | Behåll pass och kommentera varför inget ska ske |
pass, ... och en kommentar fyller olika roller
En kommentar förklarar något för den som läser koden, men räknas inte som en Python-sats. Därför räcker inte detta som kropp i en funktion:
def hämta_data():
# Implementeras senareLägg till pass om funktionen behöver kunna köras innan implementationen finns. Utan den tomma satsen återstår ett syntaxfel.
Du kan också skriva ellipsen ... som en sats. I den rollen fungerar den som en möjlig platshållare, men den är Python-objektet Ellipsis, inte samma särskilda sats som pass. Den officiella Python-handledningen nämner ellipsen som ett möjligt alternativ i vissa platshållare, men pass säger rakare att blocket inte ska göra någonting.
def hämta_data():
...För ett kort kodutkast kan båda uttrycken vara begripliga. Om koden ska vara lätt att läsa för ett team skulle jag välja pass när blocket verkligen är tomt, och lägga en kommentar där det behövs för att förklara varför.
Låt platshållaren synas innan den blir kvar
pass är praktiskt när du bygger skelettet till ett program, men det kan också få ofärdig logik att se färdig ut. En tom funktion kraschar kanske inte, men den uppfyller inte uppgiften. Jag tycker därför att en kort kommentar som anger vad som saknas är bättre än en tyst platshållare som ingen längre reagerar på.
När en kodrad inte ska utföra någon åtgärd är pass rätt verktyg. När något ska hoppas över, avslutas eller hanteras behöver du i stället välja den sats som faktiskt styr programmets flöde.