파이썬 argparse 입력 검증: 필수 옵션, 허용 값, 처리 건수 제한하기

자동화 실행 인자는 argparse에서 필수 여부·허용 값·범위를 검사하고, 실제 반영은 별도 명시 옵션으로 분리하세요.

확인일: 2026-10-24. Python 3.14 표준 라이브러리 예제입니다. Windows Python 3.14.4에서 합성 입력으로 로컬 실행과 assert 검사를 통과했습니다.

왜 실행 인자를 먼저 검사해야 하나요?

스케줄러에서 같은 프로그램을 반복 실행할 때 옵션을 빠뜨리거나 대상을 오타로 입력하면, 잘못된 자료를 처리할 수 있습니다. 이 예제는 데이터 조회나 변경보다 앞에 두는 명령줄 입력 검증 계층입니다. source는 sales 또는 support, limit는 1~1000 정수로 제한합니다. 이 숫자는 서비스 한도가 아니라 합성 예제의 입력 계약입니다.

기본 동작을 어떻게 정하나요?

--source는 반드시 입력해야 하고 --limit를 생략하면 100입니다. --apply는 존재할 때만 True가 되는 플래그로 기본 False입니다. allow_abbrev=False로 --sou 같은 긴 옵션의 축약을 허용하지 않습니다. 옵션을 정확히 적도록 하는 선택이며 모든 CLI의 보편적인 필수 설정은 아닙니다.

최소 예제와 실패 조건

아래 코드는 인자 분석기와 자체 테스트입니다. 실제 파일이나 API를 처리하는 함수는 없습니다. 따라서 --apply를 넣어도 이 코드 자체가 운영 자료를 변경하지 않습니다. 실제 프로그램에는 분석 결과를 확인한 뒤 미리보기와 반영 함수를 분기하는 호출부를 별도로 작성해야 합니다.

import argparse
from contextlib import redirect_stderr
from io import StringIO

def bounded_limit(text):
    try:
        value = int(text)
    except ValueError:
        raise argparse.ArgumentTypeError("정수가 필요합니다") from None
    if not 1 <= value <= 1000:
        raise argparse.ArgumentTypeError("1~1000 범위여야 합니다")
    return value

def make_parser():
    parser = argparse.ArgumentParser(prog="report.py", allow_abbrev=False, color=False)
    parser.add_argument("--source", required=True, choices=["sales", "support"])
    parser.add_argument("--limit", type=bounded_limit, default=100)
    parser.add_argument("--apply", action="store_true")
    return parser

parser = make_parser()
args = parser.parse_args(["--source", "sales"])
assert (args.source, args.limit, args.apply) == ("sales", 100, False)
assert parser.parse_args(["--source", "support", "--limit", "1", "--apply"]).apply
assert parser.parse_args(["--source", "sales", "--limit", "1000"]).limit == 1000
for argv in [[], ["--source", "unknown"], ["--sou", "sales"],
             ["--source", "sales", "--limit", "0"],
             ["--source", "sales", "--limit", "1001"],
             ["--source", "sales", "--limit", "abc"]]:
    with redirect_stderr(StringIO()):
        try:
            parser.parse_args(argv)
        except SystemExit as error:
            assert error.code == 2
        else:
            raise AssertionError("잘못된 인자가 통과했습니다")
print("기본값: source=sales limit=100 apply=False")
print("필수 인자·선택지·축약 옵션·범위·자료형 검사 통과")

검증한 출력

기본값: source=sales limit=100 apply=False
필수 인자·선택지·축약 옵션·범위·자료형 검사 통과

실행 결과를 어떻게 해석하나요?

정상 입력은 Namespace로 변환됩니다. 테스트에서 필수 옵션 누락, 잘못된 source, 축약 옵션, 범위 밖 건수와 정수가 아닌 건수가 SystemExit(2)를 발생시키는지 검사했습니다. 테스트에서는 예상 오류 문구만 메모리 스트림으로 받았고, 운영에서 오류를 숨기라는 뜻은 아닙니다. argparse 기본 오류 처리는 사용법과 오류를 stderr에 표시하고 프로세스를 종료합니다.

실제 스크립트에 연결할 때 주의할 점

명령줄에서 읽을 때는 parser.parse_args()처럼 목록 인자를 생략합니다. 아래 합성 테스트는 재현성을 위해 명시적인 목록을 전달합니다. Windows 스케줄러의 프로그램 경로·작업 폴더·따옴표 설정은 별도 확인 대상이며 이 예제로 실행 성공을 보장하지 않습니다. 중복 옵션은 마지막 값이 사용될 수 있으므로 단 한 번의 입력만 허용해야 한다면 별도 정책이 필요합니다. 비밀번호나 API 키는 명령줄 인자에 넣지 마세요. 프로세스 정보와 기록에 드러날 수 있습니다.

자주 묻는 질문

store_true에 false라는 문자열을 주나요?

아닙니다. --apply가 없으면 False, 있으면 True입니다. --apply false는 이 정의에서 정상적인 사용법이 아닙니다.

코드를 바로 실행하면 데이터를 바꾸나요?

아닙니다. 예제는 파서 테스트만 실행합니다. 실제 처리·권한·미리보기 분기는 업무 코드에 별도로 구현해야 합니다.

공식 출처와 관련 글

아래 공식 문서는 2026-10-24에 확인했습니다.

AI 보조로 작성했으며 위 로컬 예제만 검증했습니다. 외부 API·실제 업무 자료·GUI 실행이나 사람 전문가 검수를 주장하지 않습니다.

댓글

이 블로그의 인기 게시물

API 키 저장 방법: 해싱과 암호화의 차이, Fernet 예제

파이썬 Google Sheets API 연동: 서비스 계정 권한과 읽기·쓰기

Pandas 결측치 처리: isna, fillna, dropna 선택 기준