41

argparsePython 2.7で使用して、スクリプトのパラメーターの1つが0.0から1.0の範囲にあることを要求したいと思います。argparse.add_argument()これをサポートしますか?

4

4 に答える 4

43

typeパラメータadd_argumentは、文字列を受け取り、変換された値を返す呼び出し可能なオブジェクトである必要があります。floatその値をチェックし、範囲外の場合はエラーを発生させるラッパーを作成できます。

def restricted_float(x):
    try:
        x = float(x)
    except ValueError:
        raise argparse.ArgumentTypeError("%r not a floating-point literal" % (x,))

    if x < 0.0 or x > 1.0:
        raise argparse.ArgumentTypeError("%r not in range [0.0, 1.0]"%(x,))
    return x

p = argparse.ArgumentParser()
p.add_argument("--arg", type=restricted_float)
于 2012-08-24T21:43:54.193 に答える
29

これは、指定された範囲内の任意のfloatと「等しい」と見なされるカスタムクラスを使用して、choicesパラメーターtoを使用するメソッドです。add_argument

import argparse

class Range(object):
    def __init__(self, start, end):
        self.start = start
        self.end = end
    def __eq__(self, other):
        return self.start <= other <= self.end

parser = argparse.ArgumentParser()
parser.add_argument('--foo', type=float, choices=[Range(0.0, 1.0)])
于 2012-08-24T21:48:12.723 に答える
5

strを追加すると、ヘルプで境界が表示されます。

import argparse

class Range(object):
    def __init__(self, start, end):
        self.start = start
        self.end = end

    def __eq__(self, other):
        return self.start <= other <= self.end

    def __contains__(self, item):
        return self.__eq__(item)

    def __iter__(self):
        yield self

    def __str__(self):
        return '[{0},{1}]'.format(self.start, self.end)

parser = argparse.ArgumentParser()
parser.add_argument('--foo', type=float, choices=Range(0.0, 1.0))
parser.add_argument('--bar', type=float, choices=[Range(0.0, 1.0), Range(2.0,3.0)])
于 2020-01-10T09:20:56.110 に答える
2

argparse.add_argument呼び出しは、「choices」パラメーターとしてiterableを想定しています。では、上記のRangeクラスにiterableプロパティを追加するのはどうでしょうか。したがって、両方のシナリオを使用できます。

import argparse

class Range(object):
    def __init__(self, start, end):
        self.start = start
        self.end = end

    def __eq__(self, other):
        return self.start <= other <= self.end

    def __contains__(self, item):
        return self.__eq__(item)

    def __iter__(self):
        yield self

parser = argparse.ArgumentParser()
parser.add_argument('--foo', type=float, choices=Range(0.0, 1.0))
parser.add_argument('--bar', type=float, choices=[Range(0.0, 1.0), Range(2.0,3.0)])
于 2019-09-19T06:32:05.050 に答える