Како користити ‘Пасс’ изјаву у Питхон-у

Приликом развоја софтвера, ретко се дешава да се целокупан код напише одједном и да се програм покрене тек на самом крају. Уместо тога, уобичајена пракса је писање дела кода, тестирање, додавање нових делова и поновно тестирање, све док се пројекат не приведе крају.

Овај приступ подразумева поделу сложеног задатка на мање, управљивије целине, фокусирајући се на кључне делове и привремено изостављајући остале, да би се касније попунили. Да би се ова стратегија ефикасно применила у Пајтону, користи се наредба `pass`, што је и тема овог чланка.

Шта представља наредба `pass`?

За разлику од већине кључних речи које инструктују интерпретатор да изврши одређену акцију, наредба `pass` је специфична јер говори интерпретатору да не предузима никакву радњу. Она се користи унутар блокова кода.

Блокови кода у Пајтону су дефинисани увученим линијама испод дефиниција функција, класа или унутар наредби тока контроле. Наредбе тока контроле управљају редоследом извршавања програма, омогућавајући прескакање делова кода на основу услова или понављање извршавања кода у петљама. Уобичајене кључне речи за контролу тока у Пајтону су `if`, `for` и `while`.

Зашто је потребна наредба `pass`?

Као што је већ речено, наредба `pass` је наредба која не ради ништа. Међутим, зашто би нам била потребна наредба која не ради ништа приликом прављења програма који треба нешто да уради? У наредним одељцима ћемо размотрити сценарије у којима је наредба `pass` корисна.

#1. Резервисано место за будућу имплементацију

Као што је споменуто на почетку, приликом писања кода корисна је стратегија „подели па владај“. На пример, када се креира функција, може бити корисно прво дефинисати њен заглавље и оставити имплементацију тела за касније.

Међутим, Пајтонов интерпретатор ће пријавити грешку уколико се покуша са покретањем таквог кода. То је зато што Пајтон очекује да сваки блок кода (тело функције, петље, условни изрази) садржи барем једну наредбу. Пример функције без тела би изгледао овако:

def moja_funkcija():
    # Код ће бити написан касније
    # За сада нема наредби

Покретање овог кода би резултирало синтаксном грешком, која би могла изгледати овако:

File "", line 3
    # За сада нема наредби
                                     ^
SyntaxError: incomplete input

Наша стратегија „подели па владај“ не би била ефикасна уколико би морали све одједном да напишемо, али Пајтон захтева да се у блоку кода нађе барем нешто. Ту на сцену ступа наредба `pass`. Она представља валидну наредбу, тако да када се укључи у блок, Пајтон не пријављује грешку. При томе, она не врши никакву радњу, тако да не морате да бринете о логици функције. Следи пример претходне функције са додатком наредбе `pass`:

def moja_funkcija():
    # Код ће бити написан касније
    # За сада је ту само наредба pass
    pass

Сада, када се покрене овај код, неће бити пријављених грешака.

Такође, можете позвати функцију да се уверите да она не ради ништа.

Ово је, у основи, главна примена наредбе `pass` у Пајтону – као резервисано место за празне блокове кода. Ово не важи само за функције, већ и за услове, петље и класе.

#2. Имплементација апстрактних класа и интерфејса

Наредба `pass` се такође може користити за имплементацију апстрактних класа. Апстрактна класа је класа која садржи апстрактне методе, а апстрактна метода је метода која је дефинисана, али није имплементирана. Ово је слично претходном сценарију, где се наредба `pass` користи као резервисано место. Међутим, за разлику од претходног примера, где је наредба `pass` била привремена, у овом случају је она трајна.

Апстрактне класе су основне класе које дефинишу методе које њихове подкласе морају да имплементирају. Апстрактне класе не имплементирају никакву логику; оне само дефинишу методе које се морају имплементирати у класама које их наслеђују. Због тога се од апстрактне класе не креирају директно инстанце.

За креирање апстрактних класа у Пајтону користе се декоратор `@abstractmethod` и класа `ABC`, дефинисани у модулу `abc`. Уколико нисте упознати са декораторима, можете се подсетити у одговарајућем чланку.

Као што је речено, модул `abc` дефинише декоратор `@abstractmethod` и класу `ABC`, који се користе на следећи начин:

from abc import (abstractmethod, ABC)

class OsnovnaKlasa(ABC):

    @abstractmethod
    def osnovna_metoda(self):
        # Osnovna metoda je metoda koju svaka podklasa klase OsnovnaKlasa treba da implementira
        # Stoga je ovde samo deifinišemo bez implementacije
        # U telu metode koristimo naredbu pass kako bi kod bio validan
        pass

Класа `OsnovnaKlasa` наслеђује класу `ABC`. Поред тога, декоратор `@abstractmethod` је примењен на методу `osnovna_metoda`. Сада можете наследити ову класу и имплементирати методу `osnovna_metoda`.

class IzvedenaKlasa(OsnovnaKlasa):
    def osnovna_metoda(self):
        print("Pozdrav iz definisane osnovne metode")

Затим, можете креирати инстанцу ове класе и тестирати методу `osnovna_metoda`.

moj_objekat = IzvedenaKlasa()

moj_objekat.osnovna_metoda()

Након покретања, очекује се да ће порука бити приказана на екрану.

Pozdrav iz definisane osnovne metode

#3. Игнорисање ухваћених изузетака

Када програм у Пајтону наиђе на грешку, покреће изузетак. Изузеци могу ометати рад програма јер доводе до његовог прекида и заустављања извршавања. Међутим, изузеци се могу ухватити и њима се може управљати како би се спречило рушење програма. Наредба `pass` се може користити уколико се не жели предузимати никаква акција у вези са грешком. Следи пример:

try:
    # Код који ће гарантирано покренути изузетак
    raise Exception('Неки изузетак')
except:
    pass

Уколико покренете горе наведени код, ништа се неће десити. То је зато што се изузетак покрене и њиме управља блок кода унутар наредбе `except`. Међутим, овај блок кода не ради ништа, тако да се неће десити никакве промене. Уобичајена пракса је евидентирање изузетака или њихово елегантно решавање, али уколико не желите да предузимате никакву акцију, ово је начин да то урадите.

По чему се наредба `pass` разликује од наредби `break` и `continue`?

Друге кључне речи на које можете наићи су `break` и `continue`. У наставку ћу укратко објаснити њихову функцију како би се уочила њихова разлика у односу на наредбу `pass`.

Наредба `break`

Наредба `break` се користи за излазак из петље. Све наредне итерације петље се поништавају. На пример, уколико се пише функција линеарне претраге, након проналажења елемента нема потребе да се петља наставља до краја листе. У том случају је пожељно искочити из петље, што се може учинити коришћењем наредбе `break`. Следи пример функције линеарне претраге:

def linearna_pretraga(vrednosti, trazena_vrednost):
    for i in range(len(vrednosti)):
        if vrednosti[i] == trazena_vrednost
            print("Vrednost pronađena na indeksu", i)
            break

Наредба `continue`

Наредба `continue` се користи за прескакање тренутне итерације у петљи. Уколико се врши итерација кроз листу бројева, када програм наиђе на наредбу `continue`, зауставиће тренутну итерацију и прећи на следећу. Петља наставља са радом. Следи пример функције која користи наредбу `continue`. Програм удвостручује све непарне бројеве, тако да листа садржи само парне бројеве.

def napravi_parne(brojevi):
    for i in range(len(brojevi)):
        if brojevi[i] % 2 == 0:
            # Ako je broj vec paran, preskacemo na sledecu iteraciju koriscenjem continue
            continue
        
        # Samo neparni brojevi ce doci do ove tacke
        # Udvostrucujemo broj kako bi postao paran
        brojevi[i] *= 2

Надам се да вам је, након разумевања наредби `break` и `continue`, јаснија њихова разлика у односу на наредбу `pass`.

Најбоље праксе за коришћење наредбе `pass`

✅ Запамтите да се наредба `pass` обично користи као привремено резервисано место; обавезно замените наредбу `pass` стварним кодом када за то дође време.

✅ Уколико наредбу `pass` користите за нешто друго осим као привремено резервисано место, додајте коментар који објашњава њену намену.

Завршне речи

У овом чланку је објашњена наредба `pass` у Пајтону, корисна кључна реч која омогућава стратегију „подели па владај“ приликом писања кода. Наредба `pass` је такође покривена у Пајтоновој документацији.

У наставку, можете погледати уобичајене типове грешака у Пајтону и како да их решите.