Python 2.7でargparse
を使用して、スクリプトのパラメーターの1つが0.0から1.0の範囲内にあることを要求したい。argparse.add_argument()
はサポートしますかこの?
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)
choices
パラメータを使用して add_argument
、指定された範囲内の任意のfloatと「等しい」と見なされるカスタムクラスを使用:
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)])
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)])
Argparse.add_argument呼び出しは、「choices」パラメーターとして反復可能であることを想定しています。では、上記の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)])