파이썬에서 __name__ == ‘__main__’인지 이해하기

이 가이드에서는 파이썬에서 if __name__ == ‘__main__’의 기능과 중요성을 이해할 것입니다.

다른 모듈이 있는 Python 코드베이스를 훑어본 적이 있습니까?

그렇다면 아마도 하나 이상의 모듈에서 if __name__ == ‘__main__’ 조건문을 접했을 것입니다. 앞으로 몇 분 동안 위의 조건문이 무엇을 의미하는지 설명하고 도움이 될 수 있는 예를 살펴보겠습니다.

의 시작하자!

Python에서 __name__의 중요성은 무엇입니까?

Python에서 모듈은 함수 정의, 평가할 표현식 세트 등을 포함하는 .py 파일입니다. 예를 들어 hello_world.py라는 파일이 있는 경우 이를 hello_world.py 파일 또는 hello_world 모듈이라고 합니다.

Python 모듈을 실행할 때 Python 인터프리터는 실행 전에 몇 가지 특수 변수에 대한 값을 설정합니다. __name__은 그 중 하나입니다. __name__의 중요성을 이해하는 열쇠는 파이썬에서 가져오기가 어떻게 작동하는지 이해하는 것입니다.

📁 여기에서 이 섹션의 코드를 다운로드하세요.

example-1 폴더로 이동합니다. module1.py 파일이 있습니다. __name__ 변수는 현재 모듈의 네임스페이스에 있습니다.

이 모듈은 __name__ 변수의 값이 뒤따르는 라인을 출력합니다.

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

이제 명령줄에서 module1을 실행해 보겠습니다.

$ python module1.py

출력에서 __name__ 변수가 __main__으로 설정되었음을 알 수 있습니다.

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

Python에서 모듈 가져오기

Python 모듈을 실행하는 것 외에도 현재 모듈 내에서 다른 Python 모듈의 기능을 사용하려는 경우가 있습니다. Python은 가져오기를 통해 이를 용이하게 합니다.

가져오기를 사용하면 코드를 다시 작성할 필요 없이 현재 모듈의 범위로 가져와서 다른 모듈의 기능을 재사용할 수 있습니다.

module2.py 파일에는 다음이 포함됩니다. 내부에 module1을 가져왔습니다. 모듈2.

# example-1/module2.py

import module1 # module1 is imported

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

module2.py를 실행하고 출력을 관찰합니다.

$ python module2.py

아래 출력에서:

  • module1을 module2 내부로 가져올 때 내부에서 실행되고 해당 출력이 출력되는 것을 볼 수 있습니다.
  • 하지만 이번에는 __name__ 변수가 __main__이 아니라 module1입니다.
  • module2를 직접 실행했기 때문에 모듈에 해당하는 __name__ 변수는 이제 __main__입니다.
Output

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

💡 핵심 아이디어:

  랜섬웨어로부터 Synology NAS를 보호하는 방법

– 모듈이 직접 실행되는 경우 해당 __name__ 변수는 __main__과 동일하게 설정됩니다.

– 모듈을 다른 모듈 내부로 가져오면 해당 __name__이 모듈 이름으로 설정됩니다.

파이썬에서 if __name__==’__main__’의 예

이 섹션에서는 if __name__ == ‘__main__’ 조건의 실제 사용 사례를 볼 수 있습니다. 간단한 함수를 정의한 다음 단위 테스트를 작성하여 함수가 예상대로 작동하는지 확인합니다.

📁 코드를 다운받아 따라해보세요.

이 섹션의 코드는 example-2 폴더에서 찾을 수 있습니다.

여기에서 add.py는 함수 add_ab()의 정의를 포함하는 Python 파일입니다. add_ab() 함수는 두 개의 숫자를 가져와서 합을 반환합니다.

# example-2/add.py

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

우리는 파이썬의 unittest 모듈을 사용하여 add_ab() 함수를 테스트할 것입니다.

Python 함수에 대한 테스트 케이스 작성

test_add 모듈의 내용이 포함된 아래 코드 스니펫을 보십시오.

# 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의 내장 단위 테스트 모듈을 가져옵니다.
  • add 모듈에서 add_ab() 함수를 가져옵니다.
  • 테스트 클래스 TestAdd 및 테스트 케이스 세트를 테스트 클래스 내의 메소드로 정의합니다.

코드에 대한 단위 테스트를 설정하려면 먼저 unittest.TestCase에서 상속하는 테스트 클래스를 정의해야 합니다. 모든 테스트 케이스는 클래스 내부의 메소드로 지정되어야 하며 test_로 시작해야 합니다.

참고: 메서드 이름을 test_으로 지정하지 않으면 해당 테스트가 감지되지 않으므로 실행되지 않습니다.

이제 터미널에서 test_add 모듈을 실행해 봅시다.

$ python test_add.py

출력이 없고 테스트가 실행되지 않은 것을 볼 수 있습니다.

왜 이럴까?🤔

단위 테스트를 실행하기 위해서는 test_add.py를 실행하면서 아래 명령어로 unittest를 메인 모듈로 실행해야 하기 때문이다.

$ python -m unittest test_add.py

위의 verbose 명령을 실행하면 세 가지 테스트가 모두 성공적으로 실행되었음을 알 수 있습니다.

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

OK

하지만 이 모듈 test_add가 실행될 때 테스트를 실행하는 것이 편리할 것입니다. 네? 다음 섹션에서 수행하는 방법을 알아보겠습니다.

  iOS용 Gmail에서 발신자 이미지를 숨기는 방법

if __name__ == ‘__main__’을 사용하여 unittest를 메인 모듈로 실행하기

모듈이 직접 실행될 때 모든 단위 테스트를 실행하려면 조건을 추가할 수 있습니다.

# 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 인터프리터에게 다음과 같이 알려줍니다. 이 모듈이 직접 실행되면 내부에서 코드를 실행하십시오. unittest.main().

위의 두 줄의 코드를 추가한 후 test_add 모듈을 실행할 수 있습니다.

$ python test_add.py

▶️ 테스트 추가 모듈을 직접 실행하면 우리가 정의한 세 가지 테스트가 모두 실행됩니다.

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

OK

위의 출력 OK는 모든 테스트가 성공적으로 실행되었음을 나타냅니다. 세 개의 점 …은 세 가지 테스트가 실행되었고 모두 통과했음을 나타냅니다.

이제 예상되는 반환 값 test_add_1_minus7을 8로 변경해 보겠습니다. 이 경우 함수는 -6을 반환하므로 하나의 실패한 테스트가 있어야 합니다.

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

아래 출력에서 ​​볼 수 있듯이 세 가지 테스트 중 .F를 얻었고 그 중 하나는 실패했습니다(두 번째 테스트). 그리고 역추적에서 – 6 != 8을 나타내는 AssertionError를 얻습니다.

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)

주목해야 할 한 가지 중요한 점은 테스트가 반드시 테스트 클래스에 지정된 것과 같은 순서로 실행되는 것은 아니라는 것입니다. 위의 예에서 test_add_1_minus7은 테스트 클래스의 세 번째 메서드로 정의되어 있지만 해당 테스트는 두 번째로 실행되었습니다.

합산

이 튜토리얼이 파이썬에서 if __name__ == ‘__main__’ 조건문이 어떻게 작동하는지 이해하는 데 도움이 되었기를 바랍니다.

주요 내용을 간략히 요약하면 다음과 같습니다.

  • Python 인터프리터는 Python 스크립트를 실행하기 전에 __name__ 변수를 설정합니다.
  • 모듈을 직접 실행할 때 __name__의 값은 __main__입니다.
  • 다른 Python 스크립트 내에서 모듈을 가져올 때 __name__의 값은 모듈 이름입니다.
  • if __name__ == ‘__main__’을 사용하여 실행을 제어하고 직접 실행과 가져온 실행 중에 각각 실행되는 모듈 부분을 제어할 수 있습니다.
  PowerPoint 애니메이션을 비활성화하거나 삭제하는 방법

다음으로 Python 세트에 대한 이 심층 가이드를 확인하세요. 즐거운 배움!🎉