Python의 argparse에서 부울 값을 다룰 때 주의하십시오.

사업

Python에서 명령줄 인수를 처리하려면 sys 모듈의 argv 또는 argparse 모듈을 사용하십시오.

argparse 모듈을 사용하면 명령줄 인수를 유연하게 처리할 수 있지만 부울 값(true, false)을 처리할 때는 주의해야 합니다.

다음 정보가 여기에 제공됩니다.

  • 인수의 쉬운 정의를 위한 argparse
  • argparse를 사용하여 인수(유형)의 유형을 지정합니다.
  • add_argument()의 인수 유형으로 “bool”을 지정하지 마십시오.
  • bool()에 의한 판단
  • 인수 유형 대신 인수 조치를 사용하십시오.
  • strtobool() 함수 사용

인수의 쉬운 정의를 위한 argparse

argparse 모듈을 사용하면 명령줄 인수를 쉽게 정의할 수 있습니다.

argparse 모듈을 사용하면 사용자 친화적인 명령줄 인터페이스를 쉽게 만들 수 있습니다. 프로그램에 필요한 인수를 정의하면 argparse가 sys.argv에서 해당 옵션을 구문 분석하는 방법을 알아낼 것입니다. argparse 모듈은 자동으로 도움말 및 사용 메시지를 생성하고 사용자가 프로그램에 잘못된 인수를 지정하면 오류를 발생시킵니다. 사용자가 프로그램에 잘못된 인수를 지정할 때 오류가 발생합니다.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

argparse를 사용하여 인수(유형)의 유형을 지정합니다.

argparse의 유용한 기능은 유형(유형)을 지정하는 것입니다.

예를 들어 정수(int) 유형을 지정하면 인수가 자동으로 int로 변환되고 int가 아닌 인수에 대해서도 오류가 발생합니다.

유형은 add_argument()의 인수 유형으로 지정됩니다.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('arg_int', type=int)

args = parser.parse_args()
print(args.arg_int)
print(type(args.arg_int))

명령줄에서 이 파일을 실행합니다.

$ python argparse_type_int.py 100
100
<type 'int'>

인수 100은 int로 읽습니다.

int가 아닌 값을 인수로 사용하면 오류가 발생합니다.

$ python argparse_type_int.py foo
usage: argparse_type_int.py [-h] arg_int
argparse_type_int.py: error: argument arg_int: invalid int value: 'foo'

$ python argparse_type_int.py 1.23
usage: argparse_type_int.py [-h] arg_int
argparse_type_int.py: error: argument arg_int: invalid int value: '1.23'

예상치 못한 논쟁을 할 때 매우 유용합니다.

add_argument()의 인수 유형으로 “bool”을 지정하지 마십시오.

bool을 add_argument()의 인수 유형으로 지정하면 int 및 float와 같은 bool이 예상대로 작동하지 않는다는 점에 유의하는 것이 중요합니다.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('arg_bool', type=bool)

args = parser.parse_args()
print(args.arg_bool)
print(type(args.arg_bool))

명령줄에서 이 파일을 실행합니다.

$ python argparse_type_bool.py True
True
<type 'bool'>

true가 인수로 사용되면 bool 유형 true로 읽힙니다. 이것은 예상된 동작이지만 문제는 다음과 같은 경우입니다.

$ python argparse_type_bool.py False
True
<type 'bool'>

$ python argparse_type_bool.py bar
True
<type 'bool'>

false 또는 다른 문자열을 인수로 사용하면 true로 읽힙니다.

이런 일이 발생하는 이유는 type=xxx가 add_argument()에 지정되었을 때 인수가 xxx()에 전달되기 때문입니다.

예를 들어 type=int이면 인수가 int()에 전달됩니다. type=float이면 float().

type=bool의 경우에도 마찬가지입니다. 즉, 인수가 bool()에 전달됩니다.

bool()에 의한 판단

이 bool()은 까다로운 것입니다.

다음 값은 거짓으로 간주됩니다.

  • None
  • false
  • 숫자 유형에서는 0입니다. 예를 들어 다음 값
    • 0
    • 0
    • 0j
  • 빈 시퀀스입니다. 예를 들어
    • ()
    • []
  • 매핑이 비어 있습니다. 예를 들어
    • {}

다른 모든 값은 true로 간주되므로 많은 유형의 객체가 항상 true입니다. 부울 결과를 반환하는 연산 및 내장 함수는 달리 명시되지 않는 한 항상 0 또는 False를 false 값으로, 1 또는 True를 true 값으로 반환합니다.

따라서 ‘true’ 또는 ‘false’ 여부에 관계없이 bool()에 전달된 비어 있지 않은 모든 문자열은 true를 반환합니다. 빈 문자열만 false가 됩니다.

print(bool('True'))
print(bool('False'))
print(bool('abc'))
# True
# True
# True

print(bool(''))
# False

type=bool이 add_argument()에 설정되면 인수가 bool()에 전달됩니다. 따라서 위의 예와 같이 false를 인자로 사용하면 bool()에 의해 문자열 ‘False’로 변환되어 true로 읽혀집니다.

인수 유형 대신 인수 조치를 사용하십시오.

argparse에서 부울 값을 사용하려면 인수 작업에 ‘store_true’ 또는 ‘store_false’를 지정하십시오.

  • store_true’
  • store_false’

이것들은 각각 True와 False를 저장할 ‘store_const’의 특별한 버전이 될 것입니다. 또한 기본값을 각각 False 및 True로 순서대로 설정합니다.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--en', action='store_true')

args = parser.parse_args()
print(args.en)
print(type(args.en))

이 예에서는 다음과 같은 옵션이 제공됩니다.
--en따라서 en이 true로 설정되지 않으면 en의 기본값인 false로 로드됩니다.

$ python argparse_option_bool.py --en
True
<type 'bool'>

$ python argparse_option_bool.py
False
<type 'bool'>

기본값을 true로 설정하고 옵션을 추가할 때 false로 설정하려면 다음을 수행하십시오.
action='store_false'

strtobool() 함수 사용

옵션 대신 위치 인수를 사용하려면 strtobool() 함수를 사용할 수도 있습니다.

strtobool()은 문자열을 true(1) 또는 false(0)로 변환하는 함수입니다.

부울 문자열을 true(1) 또는 false(0)로 변환합니다.
실제 값은 다음과 같습니다

  • y
  • yes
  • true
  • on
  • 1

거짓 값은 다음과 같습니다.

  • n
  • no
  • f
  • false
  • off
  • 0

val이 위의 항목이 아니면 ValueError가 발생합니다.

9. API Reference – strtobool() — Python 3.10.0 Documentation

대소문자를 구분하지 않으므로 예를 들어 다음을 사용할 수 있습니다. 다른 문자열은 오류가 발생합니다.

  • TRUE'
  • True'
  • YES'
from distutils.util import strtobool

print(strtobool('true'))
print(strtobool('True'))
print(strtobool('TRUE'))
# 1
# 1
# 1

print(strtobool('t'))
print(strtobool('yes'))
print(strtobool('y'))
print(strtobool('on'))
print(strtobool('1'))
# 1
# 1
# 1
# 1
# 1

print(strtobool('false'))
print(strtobool('False'))
print(strtobool('FALSE'))
# 0
# 0
# 0

print(strtobool('f'))
print(strtobool('no'))
print(strtobool('n'))
print(strtobool('off'))
print(strtobool('0'))
# 0
# 0
# 0
# 0
# 0

# print(strtobool('abc'))
# ValueError: invalid truth value 'abc'

이름은 strtobool()이지만 반환 값은 bool이 아니라 int(1 또는 0)입니다.

print(type(strtobool('true')))
# <class 'int'>

앞서 작성한 것처럼 argparse의 add_argument()에 type=xxx를 지정하면 인수가 xxx()에 전달됩니다. 따라서 다음을 수행할 수 있습니다.
type=strtobool

import argparse
from distutils.util import strtobool

parser = argparse.ArgumentParser()
parser.add_argument('arg_bool', type=strtobool)

args = parser.parse_args()
print(args.arg_bool)
print(type(args.arg_bool))

반환 값은 bool 유형이 아니라 int 유형 1 또는 0이지만 true 또는 false를 인수로 사용하여 true 또는 false 값을 읽을 수 있습니다.

$ python argparse_type_strtobool.py true
1
<type 'int'>

$ python argparse_type_strtobool.py false
0
<type 'int'>

또한 인수가 예상되지 않은 경우 오류가 제대로 생성됩니다.

$ python argparse_type_strtobool.py bar
usage: argparse_type_strtobool.py [-h] arg_bool
argparse_type_strtobool.py: error: argument arg_bool: invalid strtobool value: 'bar'