안녕하세요. 이번 시간에는 프로그램에 필수 인자와 선택 인자 옵션을 주기 위해 쓰는 argparse에 대해서 알아보고자 해요. 상당히 방대하지만, 필요하다 싶은 것만 빠르게 추려보도록 할게요.

 


 먼저 예제 1번입니다. argparse.ArgumentParser()로 파서를 하나 생성합니다. 다음에, add_argument로 argument 2개를 생성할 거에요. a와 b입니다. 이 둘은 필수 인자들이 되겠습니다. 다음에, 6번째 줄에 parser.parse_args()로 들어온 인자들에 대한 정보들을 리턴하는데요. 이를 vars로 딕셔너리로 변환합니다.

 

 7번째 줄에, 인자 "a"와 "b"에 들어온 수를 합해서, 결과를 출력해요.

 

 

 python main.py를 입력해 봅시다. 그러면, a와 b가 필요한데 없어서 빼액 하고 있어요. 1과 2를 넣어봅시다.

 

 

 그러면 1과 2를 더한 값인 3이 나오게 됩니다. 여기까지 정리. add_argument("a")를 넣어주면 "a"는 필수 인자가 된다.

 


 그런데 ls 같은 것을 써보면 ls만 단독으로 써도 됨을 알 수 있어요. -r이라던지 -n과 같은 것은 선택적인 인자들입니다.

 

 6번째 줄을 봅시다. add_argument("--c")입니다. 이는 --c가 들어가도 되고 안 들어가도 되는 것을 의미합니다.

 

 

 다시 python main.py만 입력해 보면, main.py [--c C] a b가 들어옴을 알 수 있는데요. a와 b는 필수 인자이지만, --c는 들어가도 되고 그렇지 않아도 됨을 알 수 있답니다. 이제, python main.py 1 2를 입력해 보겠습니다.

 

 어라? 오류가 뜹니다. 왜 그럴까요? "c"라는 값이 없으면 c를 None으로 세팅하기 때문입니다. 고로, --c라는 옵션 값이 없을 때, 디폴트로 어떤 값으로 세팅해야 할 지가 필요한데요.

 

 

 6번째 줄을 봅시다. default=0으로 --c가 없을 때 0이라는 값을 넣어주었습니다. 이제 프로그램이 제대로 실행되나 볼까요?

 

 

 a에 1이 들어가고 b가 2가 들어갔을 때입니다. --c에 아무것도 없네요? 따라서, 1 + 2 + 0 = 3이 출력되어야 합니다. 제대로 나왔네요.

 

 

 다음 a에 1, b에 2가 들어가고 선택적인 --c에 3이 들어간 상황입니다. 1 + 2 + 3 = 6이 나와야 되는데, 6이 출력됩니다. 역시 제대로 나왔습니다. 여기까지 정리합시다. add_argument에 --c, --d와 같이 넣으면 --c, --d는 선택적인 옵션으로 동작합니다. 대신에 --c나 --d가 없으면 해당 argument는 없다는 표시인 None으로 되어버립니다. 그렇기에, 옵션값이 없을 때 default 값을 설정하기 위해서는 default=0과 같이 설정해 주어야 합니다.

 


 그런데, 유저의 입력을 너무 믿으면 안 됩니다. 사실 위의 예제들은 문제가 있습니다. 어떻게 인자값이 들어올지도 모르는데, int 형으로 받겠구나. 하고 가정을 해 버리기 때문입니다. 예를 들어 main.py a1 b1 --c 3 이렇게 입력하면 어떻게 될까요?

 

 오류가 떠 버립니다. 우리는 ret를 계산하기 전에 핸들링 할 필요가 있는데요. add_argument에서 type 인자를 주면 가능합니다. 예를 들어, "a", "b", "--c"가 int만 받아야 한다고 해 봅시다.

 

 

 4 ~ 6번째 줄을 봅시다. "a", "b", "--c"의 type을 int만 허용합니다. 이 경우, parser.parse_args() 과정에서 유효하지 않은 인자들이 걸러지게 됩니다.

 

 python main.py a1 b1 --c 3을 입력했어요. a1과 b1은 int('a1') 이런 식으로 되지 않으니, 에러를 뱉습니다. parse_args 과정에서 뱉어서, 파싱 후 과정인 sum을 실행하지 않는 것이 핵심이라고 할 수 있습니다. 비슷하게 choices로 특정 값만 제한을 거는 것도 가능합니다.

 

 정리하면, type이랑 choices 등으로 입력값을 검증할 수 있다는 점입니다.

 


 추가로 nargs 옵션이 있습니다. 여기에서는 "+"만 설명드리겠습니다. +은 1개 혹은 그 이상 올 수 있음을 의미합니다. 저는, 인자를 가변으로 받으려고 해요. 1 혹은 1 2 3 4 혹은 1 2 3 모두 되게끔 말입니다. 받은 인자들을 모두 더하는 데 쓸 거에요. 이럴 때 "+"를 쓸 수 있어요.

 

 예를 들어 위 프로그램은 받은 인자들을 모두 더한 결과를 출력하는 것입니다.

 

 결과가 어떻게 나올까요? 1 2 3을 인자로 받은 것은 6이, 1 2 3 4를 인자로 받은 것은 10이 출력됩니다. parse한 결과가 전자의 경우에는, "n": [1, 2, 3]이 나왔고, 후자는 "n": [1, 2, 3, 4]가 나왔다는 것을 보시면 되겠습니다.