[파이썬] argparse parse_args()와 parse_known_args() 차이점

파이썬에서 명령줄 인터페이스를 구현하기 위해 argparse 모듈을 사용하는 경우, parse_args()parse_known_args() 두 가지 메소드를 사용할 수 있습니다. 이 두 메소드는 명령줄 인자를 파싱하고, 사용자의 입력을 받아서 처리하는 데 사용됩니다. 그러나 parse_args()parse_known_args()에는 몇 가지 차이점이 있으며, 이러한 차이점을 이해하는 것이 중요합니다.

parse_args()

parse_args() 메소드는 사용자의 입력을 완전히 파싱합니다. 이 메소드는 명령줄에서 전달된 모든 인자를 분석하여 해당하는 인자값을 검색하고, 인자의 타입을 지정한 다음 해당 인자값을 반환합니다. parse_args()는 명령줄에서 인자들이 정의된 순서대로 제공되기를 기대합니다.

예를 들어, 아래의 코드는 argparse를 사용하여 두 개의 인자(--name--age)를 파싱하는 예시입니다.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--name", type=str, help="이름을 입력하세요.")
parser.add_argument("--age", type=int, help="나이를 입력하세요.")

args = parser.parse_args()

print(args.name)
print(args.age)

위의 코드에서 parse_args()--name--age 인자들을 기대하고, 사용자의 입력을 받아 해당하는 값들을 추출합니다. 만약 사용자가 --name--age 인자를 올바르게 지정했다면, 해당하는 값들은 args.nameargs.age에 할당됩니다. 그렇지 않은 경우 argparse는 에러를 발생시킵니다.

parse_known_args()

parse_known_args() 메소드는 parse_args()와 매우 유사하지만, 한 가지 큰 차이점이 있습니다. 만약 parse_known_args()에 정의되지 않은 추가적인 인자들이 존재한다면, 이 메소드는 그 인자들을 무시하고 파싱한 인자들만 반환합니다. 즉, parse_known_args()는 정의되지 않은 인자들을 허용합니다.

예를 들어, 위의 예시 코드를 parse_known_args()를 사용하여 수정해보겠습니다.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--name", type=str, help="이름을 입력하세요.")
parser.add_argument("--age", type=int, help="나이를 입력하세요.")

args, unknown = parser.parse_known_args()

print(args.name)
print(args.age)

parse_known_args()의 호출 결과로 반환되는 값은 argsunknown입니다. args--name--age에 해당하는 파싱된 인자들을 포함하는 객체이고, unknownparse_known_args()에서 정의되지 않은 추가적인 인자들을 포함하는 리스트입니다.

이렇게 parse_known_args()를 사용하면, 사용자의 입력에 정의되지 않은 인자들이 포함되어 있더라도 에러가 발생하지 않습니다. 이는 애플리케이션이 유동적인 인자들을 처리하거나, 일부 인자들을 무시하고 싶을 때 유용합니다.

결론

argparseparse_args()parse_known_args()는 명령줄 인터페이스를 생성하는 데 사용되는 두 가지 메소드입니다. parse_args()는 정의된 인자를 전체적으로 파싱하고, 정의되지 않은 인자들에 대해서는 예외를 발생시킵니다. 반면에 parse_known_args()는 정의되지 않은 인자들을 무시하고, 파싱된 인자들만 반환합니다. 애플리케이션의 요구에 따라서 parse_args() 또는 parse_known_args() 중 어떤 메소드를 사용할지 결정할 수 있습니다.