PEP 299 – 모듈 내 특수 __main__() 함수
- Author:
- Jeff Epler <jepler at unpythonic.net>
- Status:
- Rejected
- Type:
- Standards Track
- Created:
- 12-Aug-2002
- Python-Version:
- 2.3
- Post-History:
- 29-Mar-2006
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
개요
많은 파이썬 모듈은 독립 실행형 스크립트로도 호출 가능 객체가 되도록 의도되었습니다. 이 PEP는 __main__()이라는 이름의 특수 함수가 이 목적으로 사용되어야 한다고 제안합니다.
동기
모듈을 독립 실행 스크립트로 호출하기 위한 단순하고 보편적인 관용구가 하나 존재해야 합니다.
반쯤 표준화된 관용구:
if __name__ == '__main__':
perform "standalone" functionality
는 C나 C++ 같은 언어의 프로그래머에게는 명확하지 않습니다. 또한 모듈이 임포트될 때는 독립 실행 함수를 호출할 수 없습니다. 변형으로:
if __name__ == '__main__':
main_function()
가 이따금 쓰이지만, 이 함수에 대한 표준 이름이 존재하지 않으며, 인자를 sys.argv에서 가져오기 때문에 다른 모든 모듈이 보는 인자 목록을 바꾸지 않고서는 특정 인자를 전달할 수 없습니다. (스레드를 사용하는 파이썬 프로그램에서 두 스레드가 서로 다른 인자 목록으로 서로 다른 모듈의 독립 실행 기능을 호출하려는 상황을 상상해 보십시오)
제안
‘메인 함수’의 표준 이름은 __main__이 되어야 합니다. 모듈이 다음과 같이 명령줄에서 호출되면:
python mymodule.py
모듈은 마치 다음 줄들이 모듈 끝에 존재하는 것처럼 동작합니다 (단, __sys 속성은 스크립트의 다른 곳에서 사용되거나 존재한다고 가정될 수 없습니다):
if globals().has_key("__main__"):
import sys as __sys
__sys.exit(__main__(__sys.argv))
다른 모듈은 다음을 실행할 수 있습니다:
import mymodule mymodule.__main__(['mymodule', ...])
스레드 안전성 문제나 __main__의 사용을 제한할 수 있는 기타 문제를 문서화하는 것은 mymodule의 책임입니다. (기타 문제로는 상호 배타적인 GUI 모듈 사용, 하드웨어 장치와 같은 공유 불가능한 리소스, sys.stdin/stdout의 재할당 등이 있을 수 있습니다)
구현
modules/main.c에서 385번째 줄 근처(PyRun_AnyFileExFlags 호출 이후)의 블록이 위의 코드(또는 이에 상응하는 C 코드)가 실행되도록 변경될 것입니다.
미해결 사항
__main__의 반환값이 종료 값으로 취급되어야 합니까?그렇습니다. 많은
__main__이 자연스럽게None을 반환하며, 이는sys.exit에 의해 “성공” 반환 코드로 변환됩니다. 숫자 결과를 반환하는 경우, 이는sys.exit()의 인자나 C의 main() 반환값과 마찬가지로 동작합니다.__main__의 인자 목록에argv[0]을 포함해야 합니까, 아니면 “실제” 인자인argv[1:]만 포함해야 합니까?argv[0]은sys.argv와의 대칭성 및 새로운 표준 관용구로의 쉬운 전환을 위해 포함됩니다.
거부
python-dev [1]에서의 짧은 논의에서 두 가지 주요 하위 호환성 문제가 제기되었으며, Guido는 어쨌든 이 아이디어가 “(문서, 사용자 습관 등의) 변경을 감수할 만큼 가치가 없고 특별히 고장 난 것도 없다”는 이유로 마음에 들지 않는다고 선언했습니다.
참고 문헌
Copyright
This document has been placed in the public domain.