programing

Python에서는 argparse를 사용하여 양의 정수만 허용합니다.

copyandpastes 2022. 10. 30. 20:59
반응형

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대신xrangepython 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로 프로그램을 종료합니다.


크레딧: Jonatan의 답변

구글 검색에서 누군가 (나 같은) 이 질문을 접했을 경우, 모듈러 방식을 사용하여 지정된 범위 내에서만 아르파르즈 정수를 허용하는 보다 일반적인 문제를 깔끔하게 해결하는 예를 다음에 제시하겠습니다.

# 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

반응형