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

게시 됨: 2022-08-12

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

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

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

의 시작하자!

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

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 모듈의 기능을 사용하려는 경우가 있습니다. 파이썬은 import 를 통해 이것을 용이하게 합니다.

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

Python에서 모듈 가져오기

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

 # 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

아래 출력에서:

  • module1module2 내부로 가져올 때 내부에서 실행되고 해당 출력이 출력되는 것을 볼 수 있습니다.
  • 하지만 이번에는 __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__.

핵심 아이디어 :

– 모듈이 직접 실행되는 경우 해당 __name__ 변수가 __main__ 으로 설정됩니다.

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

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

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

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

코드를 다운로드하고 따라해보세요.

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

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

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

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

이제 터미널에서 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 가 실행될 때 테스트를 실행하는 것이 편리할 것입니다. 다음 섹션에서 수행하는 방법을 알아보겠습니다.

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

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. , 세 가지 테스트 중 패턴 1이 실패하고(두 번째 테스트), 역추적에서 – 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__' 을 사용하여 실행을 제어하고 직접 실행과 가져온 실행 중에 각각 실행되는 모듈 부분을 제어할 수 있습니다.

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