argparse로 특정 인수의 값을 True 또는 False를 받기 위해 다음과 같이 파이썬 코드를 짜고 실행했는데 원하는 결과가 나오지 않았다.
# main.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--test",
type=bool,
default=False)
args = parser.parse_args()
print(args.test)
python main.py --test False
>> True
분명 나는 False를 줬는데 왜 True가 반환되는 것일까? 그럼 False를 반환받으려면 어떻게 해야할까?
가장 먼저 떠오른 가능성은 False를 bool type이 아니라 str로 읽고 있을 가능성이 있다. 그렇다면 빈 문자열을 입력으로 넣으면 False가 반환될것이다.
python main.py --test ''
>>
빙고! 아무것도 반환되지 않는 것으로 보아 False를 반환하였다. chatGPT 피셜로 버전에 따라 이러한 이슈가 있을 수도 있다고 한다.
Python의 argparse에서 부울 값을 다룰 때 주의하십시오.
위 블로그에서 bool 대신 store_true, store_false를 사용하기를 권장한다. 어쩐지, 오픈소스를 보다보면 parser를 store_true나 store_false로 지정해준 경우를 많이 봤었는데 이런 이유 때문이었나보다.
그렇다면 store_true와 store_false는 어떻게 사용하는 건지 예제와 함께 알아보도록 하자. 일단 두괄식으로 결과 먼저 적어두고 가겠다.
| action | 기본값(인수 미지정) | 인수 지정 시 |
|---|---|---|
| store_true | False | True |
| store_false | True | False |
아래는 인수의 action을 store_true로 지정했을 때의 예시이다.
# main.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--test",
action="store_true" # 이 부분!!
)
args = parser.parse_args()
print(args.test)
python main.py
>>
python main.py --test
>> True
위의 예시를 보면 알겠지만, store_true로 지정된 인수는 값을 받지 않는다. 인수를 지정하면은 True를 반환하고 그렇지 않으면 False를 반환하는 구조이다. 일종의 스위치라고 보면 편하다.
반대로 store_false로 지정했을때의 예시도 같이 보겠다. 당연하겠지만 store_true와 반대로 동작한다.
# main.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--test",
action="store_false" # 이 부분!!
)
args = parser.parse_args()
print(args.test)
python main.py
>> True
python main.py --test
>>
예상대로 store_true와 반대로 동작했다. store_false는 인수를 호출하지 않으면 True값을 저장하고 있다가, 인수를 불러오면 False의 값을 반환한다.
정리하면 다음과 같다.
| action | 기본값(인수 미지정) | 인수 지정 시 |
|---|---|---|
| store_true | False | True |
| store_false | True | False |
예상하지 못한 오류가 즐비한 type=bool을 쓰는것보다 이런식으로 store_true와 store_false로 스마트하게 코딩하자.