Разумевање да ли је __наме__ == ‘__маин__’ у Питхон-у

У овом водичу ћете разумети функционалност и значај иф __наме__ == ‘__маин__’ у Питхон-у.

Да ли сте икада прелетели Питхон кодну базу са различитим модулима?

Ако јесте, вероватно бисте наишли да је __наме__ == ‘__маин__’ условно у једном или више модула. У наредних неколико минута ћемо демистификовати шта горе наведени услов значи и погледати пример где може бити од помоћи.

Почнимо!

Какав је значај __наме__ у Питхон-у?

У Питхон-у, модул је .пи датотека која садржи дефиниције функција, скуп израза за процену и још много тога. На пример, ако имамо датотеку под називом хелло_ворлд.пи, називамо је датотеком хелло_ворлд.пи или хелло_ворлд модулом.

Када покренете Питхон модул, Питхон интерпретер поставља вредности за неколико специјалних променљивих пре извршења: __наме__ је једна од њих. Кључ за разумевање значаја __наме__ је разумевање како увози функционишу у Питхон-у.

📁 Преузмите код за овај одељак овде.

Пређите на фасциклу Пример-1. Имамо датотеку модуле1.пи. Променљива __наме__ налази се у именском простору тренутног модула.

Овај модул исписује ред иза којег следи вредност променљиве __наме__.

# example-1/module1.py
print("This is module1.")
print(f"The __name__ variable of module 1 is: {__name__}.")

Сада, покренимо модул1 из командне линије.

$ python module1.py

У излазу видимо да је променљива __наме__ постављена на __маин__.

This is module1.
The __name__ variable of module 1 is: __main__.

Увоз модула у Питхон

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

  Како додати филтере у Инстаграм приче

Увози вам омогућавају да поново користите функционалност другог модула – тако што ћете га увести у опсег тренутног модула – без потребе да поново пишете код.

Датотека модуле2.пи садржи следеће. Унутра смо увезли модул 1. модул2.

# example-1/module2.py

import module1 # module1 is imported

print(f"This is module2")
print(f"The __name__ variable of module2 is: {__name__}.")

Покрећемо модуле2.пи и посматрамо излаз.

$ python module2.py

У излазу испод:

  • Видимо да се модул1 покреће испод хаубе када га увеземо унутар модула2, а одговарајући излаз се штампа.
  • Али овог пута, променљива __наме__ није __маин__ већ модул1.
  • Пошто смо директно покренули модул2, променљива __наме__ која одговара модулу је сада __маин__.
Output

This is module1.
The __name__ variable of module 1 is: module1.
This is module2
The __name__ variable of module2 is: __main__.

💡 Кључна идеја:

– Ако се модул покреће директно, његова променљива __наме__ је подешена на једнака __маин__.

– Ако је модул увезен унутар другог модула, његово __наме__ се поставља на име модула.

Пример ако __наме__==’__маин__’ у Питхон-у

У одељку ћемо видети практичан случај употребе условног иф __наме__ == ‘__маин__’. Дефинисаћемо једноставну функцију, а затим ћемо написати јединичне тестове да бисмо проверили да ли функција ради како се очекује.

📁 Преузмите код и пратите га.

Код за овај одељак се може наћи у фолдеру екампле-2.

Овде адд.пи је Питхон датотека која садржи дефиницију функције адд_аб(). Функција адд_аб() узима било која два броја и враћа њихов збир.

# example-2/add.py

def add_ab(a,b):
    return a + b

Користићемо Питхон-ов модул униттест да тестирамо функцију адд_аб().

Писање тест случајева за Питхон функцију

Погледајте исечак кода испод, који садржи садржај модула тест_адд.

# example-2/test_add.py

import unittest
from add import add_ab

class TestAdd(unittest.TestCase):
    def test_add_23(self):
        self.assertEqual(add_ab(2,3), 5)
    
    def test_add_19(self):
        self.assertEqual(add_ab(1,9), 10)
    
    def test_add_1_minus7(self):
        self.assertEqual(add_ab(1,-7), -6)
    

Горњи код ради следеће:

  • Увози Питхон-ов уграђени модул за тестирање јединица
  • Увози функцију адд_аб() из модула за додавање
  • Дефинише тест класу ТестАдд и скуп тест случајева као методе унутар тест класе
  Како поделити објаву у својој Инстаграм причи

Да бисте подесили јединичне тестове за свој код, прво би требало да дефинишете тест класу која наслеђује униттест.ТестЦасе. Сви тест случајеви треба да буду специфицирани као методе унутар класе и треба да почну са тест_.

Напомена: Ако не назовете методе као тест_<неко-описно-име>, видећете да одговарајући тестови неће бити откривени и да се стога неће покренути.

Сада покушајмо да покренемо тест_адд модул са терминала.

$ python test_add.py

Видећете да нема излаза и да ниједан од тестова није покренут.

Зашто је то тако?🤔

То је зато што да бисте покренули јединичне тестове, требало би да покренете униттест као главни модул док покрећете тест_адд.пи, користећи наредбу испод.

$ python -m unittest test_add.py

Након покретања горње опширне команде, видимо да су сва три теста успешно обављена.

Output
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

Међутим, биће згодно покренути тестове када се покрене овај модул тест_адд, зар не? Хајде да научимо како то да урадимо у следећем одељку.

Коришћење иф __наме__ == ‘__маин__’ за покретање униттест-а као главног модула

Ако желите да покренете све јединичне тестове када се модул покреће директно, можете додати условни.

# example-2/test_add.py

import unittest
from add import add_ab

class TestAdd(unittest.TestCase):
    def test_add_23(self):
        self.assertEqual(add_ab(2,3), 5)
    
    def test_add_19(self):
        self.assertEqual(add_ab(1,9), 10)
    
    def test_add_1_minus7(self):
        self.assertEqual(add_ab(1,-7), -6)

# Run unittest as the main module
if __name__ == '__main__':
        unittest.main()

Услов у горњем исечку кода говори Питхон тумачу: Ако се овај модул покреће директно, онда покрените код унутра. униттест.маин().

Можете покренути модул тест_адд након што додате горња два реда кода.

$ python test_add.py

▶ Директно покретање модула за додавање теста сада покреће сва три теста која смо дефинисали.

Output
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

Горњи излаз ОК показује да су сви тестови успешно изведени. Три тачке … означавају да су три теста обављена и да су сви прошли.

  Како да преузмете слику контакта са вашег иПхоне-а

Сада, хајде да променимо очекивану повратну вредност тест_адд_1_минус7 на 8. Пошто функција враћа – 6 у овом случају, требало би да постоји један неуспешан тест.

def test_add_1_minus7(self):
        self.assertEqual(add_ab(1,-7), 8)

Као што се види у доњем излазу, добијамо .Ф., од три теста, узорак један од њих није успео (други тест), а у повратном трагу добијамо АссертионЕррор који наводи – 6 != 8.

Output
.F.
======================================================================
FAIL: test_add_1_minus7 (__main__.TestAdd)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_add.py", line 12, in test_add_1_minus7
    self.assertEqual(add_ab(1,-7), 8)
AssertionError: -6 != 8

----------------------------------------------------------------------
Ran 3 tests in 0.021s

FAILED (failures=1)

Једна важна ствар коју треба напоменути је да се тестови не изводе нужно истим редоследом којим су наведени у класи теста. У горњем примеру, тест_адд_1_минус7 је дефинисан као трећи метод у тест класи, али је одговарајући тест покренут други.

Сумирајући

Надам се да вам је овај водич помогао да разумете како функционише услов иф __наме__ == ‘__маин__’ у Питхон-у.

Ево кратког резимеа кључних закључака:

  • Питхон интерпретер поставља променљиву __наме__ пре извршавања Питхон скрипте.
  • Када директно покренете модул, вредност __наме__ је __маин__.
  • Када увезете модул унутар друге Питхон скрипте, вредност __наме__ је име модула.
  • Можете користити иф __наме__ == ‘__маин__’ да контролишете извршење и који делови модула се покрећу током директног и увезеног покретања, респективно.

Затим погледајте овај детаљни водич о Питхон сетовима. Срећно учење!🎉