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 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
많은 Python 모듈은 독립 실행형 스크립트로 호출할 수 있는 호출 가능 객체가 되도록 의도되기도 합니다. 이 PEP는 __main__()이라는 특수 함수가 이 역할을 맡도록 제안합니다.
동기
모듈을 독립 실행형 스크립트로 호출하는 단순하고 보편적인 관용구가 하나 있어야 합니다.
반쯤 표준이 된 관용구:
if __name__ == '__main__':
perform "standalone" functionality
는 C나 C++ 같은 언어의 프로그래머에게 명확하지 않습니다. 또한 모듈을 임포트했을 때 독립 실행용 함수를 호출할 수 없습니다. 다음과 같은 변형:
if __name__ == '__main__':
main_function()
와 같은 형태가 종종 보이지만, 이 함수에 대한 표준 이름은 존재하지 않으며, 인자를 sys.argv에서 가져오기 때문에 다른 모든 모듈이 보는 인자 목록을 변경하지 않고서는 특정 인자를 전달할 수 없습니다. (두 스레드가 서로 다른 인자 목록으로 서로 다른 모듈의 독립 실행 기능을 호출하려는 멀티스레드 Python 프로그램을 상상해 보십시오)
제안
‘메인 함수’의 표준 이름은 __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:]만 포함해야 합니까?sys.argv와의 대칭성과 새 표준 관용구로의 쉬운 전환을 위해argv[0]을 포함합니다.
거부
python-dev [1]에서 있었던 짧은 논의에서 두 가지 주요 하위 호환성 문제가 제기되었으며, Guido는 “(문서, 사용자 습관 등을) 변경할 만한 가치가 없고 특별히 고장 난 것도 없다”는 이유로 어쨌든 이 아이디어를 좋아하지 않는다고 선언했습니다.
참고 문헌
Copyright
This document has been placed in the public domain.