Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

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

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 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는 “(문서, 사용자 습관 등을) 변경할 만한 가치가 없고 특별히 고장 난 것도 없다”는 이유로 어쨌든 이 아이디어를 좋아하지 않는다고 선언했습니다.

참고 문헌