Python에서는 argparse를 사용하여 양의 정수만 허용합니다.
제목은 내가 일어났으면 하는 것을 거의 요약한 것이다.
여기 제가 가지고 있는 것이 있습니다. 프로그램이 양의 정수가 아닌 정수는 터지지 않지만, 사용자에게 양의 정수가 아닌 정수는 기본적으로 말도 안 된다는 것을 알려주고 싶습니다.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-g", "--games", type=int, default=162,
help="The number of games to simulate")
args = parser.parse_args()
그리고 출력:
python simulate_many.py -g 20
Setting up...
Playing games...
....................
음이 있는 출력:
python simulate_many.py -g -2
Setting up...
Playing games...
자, 이제 제가 만약을 더해서if args.games
부정적이긴 한데, 그걸 가둬둘 방법이 없을까 해서argparse
자동 사용 인쇄 기능을 활용할 수 있습니다.
다음과 같은 인쇄가 이상적입니다.
python simulate_many.py -g a
usage: simulate_many.py [-h] [-g GAMES] [-d] [-l LEAGUE]
simulate_many.py: error: argument -g/--games: invalid int value: 'a'
다음과 같은 경우:
python simulate_many.py -g -2
usage: simulate_many.py [-h] [-g GAMES] [-d] [-l LEAGUE]
simulate_many.py: error: argument -g/--games: invalid positive int value: '-2'
지금은 이렇게 하고 있고 행복할 것 같아요.
if args.games <= 0:
parser.print_help()
print "-g/--games: must be positive."
sys.exit(1)
이것은, 다음의 기능을 이용해 가능해야 합니다.type
그래도 이를 결정하는 실제 방법을 정의해야 합니다.
def check_positive(value):
ivalue = int(value)
if ivalue <= 0:
raise argparse.ArgumentTypeError("%s is an invalid positive int value" % value)
return ivalue
parser = argparse.ArgumentParser(...)
parser.add_argument('foo', type=check_positive)
이것은 기본적으로, 이 명령어를 사용한perfect_square
관한 문서에서 기능하다argparse
.
type
유우시의 답변과 같이 조건/수표를 처리하는 데 권장되는 옵션입니다.
특정의 경우는,choices
상한값도 알고 있는 경우 파라미터:
parser.add_argument('foo', type=int, choices=xrange(5, 10))
주의: 사용range
대신xrange
python 3.x의 경우
빠르고 더러운 방법은 arg에 대해 min뿐만 아니라 예측 가능한 max가 있다면 사용하는 것입니다.choices
범위와 함께
parser.add_argument('foo', type=int, choices=xrange(0, 1000))
특히 하위 분류의 경우 더 간단한 대안argparse.ArgumentParser
는, 내부로부터 검증을 개시하는 것입니다.parse_args
방법.
이러한 서브클래스 내부:
def parse_args(self, args=None, namespace=None):
"""Parse and validate args."""
namespace = super().parse_args(args, namespace)
if namespace.games <= 0:
raise self.error('The number of games must be a positive integer.')
return namespace
이 기법은 커스텀 콜 가능만큼 쿨하지 않을 수 있지만 효과가 있습니다.
개요:
이 메서드는 메시지를 포함한 사용 메시지를 표준 오류에 출력하고 상태 코드 2로 프로그램을 종료합니다.
구글 검색에서 누군가 (나 같은) 이 질문을 접했을 경우, 모듈러 방식을 사용하여 지정된 범위 내에서만 아르파르즈 정수를 허용하는 보다 일반적인 문제를 깔끔하게 해결하는 예를 다음에 제시하겠습니다.
# Custom argparse type representing a bounded int
class IntRange:
def __init__(self, imin=None, imax=None):
self.imin = imin
self.imax = imax
def __call__(self, arg):
try:
value = int(arg)
except ValueError:
raise self.exception()
if (self.imin is not None and value < self.imin) or (self.imax is not None and value > self.imax):
raise self.exception()
return value
def exception(self):
if self.imin is not None and self.imax is not None:
return argparse.ArgumentTypeError(f"Must be an integer in the range [{self.imin}, {self.imax}]")
elif self.imin is not None:
return argparse.ArgumentTypeError(f"Must be an integer >= {self.imin}")
elif self.imax is not None:
return argparse.ArgumentTypeError(f"Must be an integer <= {self.imax}")
else:
return argparse.ArgumentTypeError("Must be an integer")
이를 통해 다음과 같은 작업을 수행할 수 있습니다.
parser = argparse.ArgumentParser(...)
parser.add_argument('foo', type=IntRange(1)) # Must have foo >= 1
parser.add_argument('bar', type=IntRange(1, 7)) # Must have 1 <= bar <= 7
변수foo
이제 OP 요청과 같은 양의 정수만 사용할 수 있습니다.
위의 양식에 더해, 최대값만 사용할 수 있습니다.IntRange
:
parser.add_argument('other', type=IntRange(imax=10)) # Must have other <= 10
Yuushi의 답변을 바탕으로 다양한 숫자 유형에 대해 숫자가 양수인지 확인할 수 있는 간단한 도우미 기능도 정의할 수 있습니다.
def positive(numeric_type):
def require_positive(value):
number = numeric_type(value)
if number <= 0:
raise ArgumentTypeError(f"Number {value} must be positive.")
return number
return require_positive
도우미 함수는 다음과 같은 숫자 인수 유형에 주석을 달 때 사용할 수 있습니다.
parser = argparse.ArgumentParser(...)
parser.add_argument("positive-integer", type=positive(int))
parser.add_argument("positive-float", type=positive(float))
언급URL : https://stackoverflow.com/questions/14117415/in-python-using-argparse-allow-only-positive-integers
'programing' 카테고리의 다른 글
JavaScript 개체를 루프하거나 열거하려면 어떻게 해야 합니까? (0) | 2022.10.30 |
---|---|
PHP/PDO MariaDB Galera 클러스터 (0) | 2022.10.30 |
Java에서 주문 세트를 구현한 적이 있습니까? (0) | 2022.10.30 |
PHPUnit - 구성 파일 사용 시 '테스트가 실행되지 않음' (0) | 2022.10.30 |
v-model이 null인 경우 Vue.js에서 확인란 값을 false로 설정합니다. (0) | 2022.10.30 |