Как я могу потребовать, чтобы мой аргумент скрипта python был float между 0.0-1.0, используя argparse?

Я хотел бы использовать argparse на Python 2.7, чтобы потребовать, чтобы один из параметров моего сценария находился между диапазоном 0.0 и 1.0. argparse.add_argument() ли argparse.add_argument() это?

Ответ 1

Параметр type для add_argument просто должен быть вызываемым объектом, который принимает строку и возвращает преобразованное значение. Вы можете написать оболочку вокруг float которая проверяет ее значение и вызывает ошибку, если она выходит за пределы допустимого диапазона.

def restricted_float(x):
    x = float(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)

Ответ 2

Вот метод, который использует параметр choices для 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)])

Ответ 3

Вызов argparse.add_argument ожидает итерацию как параметр 'choices'. Так что насчет добавления итерируемого свойства в класс Range выше. Таким образом, можно использовать оба сценария:

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)])