Argparse store_true, store_fasle 사용법

김인조·2023년 9월 8일

Python

목록 보기
1/2

문제 상황


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_trueFalseTrue
store_falseTrueFalse

아래는 인수의 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_trueFalseTrue
store_falseTrueFalse

예상하지 못한 오류가 즐비한 type=bool을 쓰는것보다 이런식으로 store_truestore_false로 스마트하게 코딩하자.

0개의 댓글