如何使用argparse指定最小或最大浮点值

时间:2019-03-24 13:47:02

标签: argparse

如何使用argprase指定最小或最大浮点参数?我希望能够在最小浮点值和最大浮点值之间提供命令行参数。

我能找到的最接近的东西是choices中的add_argument()选项,但这仅指定了参数的允许值。

parser.add_argument("L", type=float, choices=range(2))

L的命令行参数0.5失败:

invalid choice: 0.5 (choose from 0, 1)

3 个答案:

答案 0 :(得分:1)

您可以(并且应该)使用自定义类型函数。它更加用户友好。

def range_limited_float_type(arg):
    """ Type function for argparse - a float within some predefined bounds """
    try:
        f = float(arg)
    except ValueError:    
        raise argparse.ArgumentTypeError("Must be a floating point number")
    if f < MIN_VAL or f > MAX_VAL:
        raise argparse.ArgumentTypeError("Argument must be < " + str(MAX_VAL) + "and > " + str(MIN_VAL))
    return f



parser.add_argument(
    '-f',
    '--float',
    type=range_limited_float_type,
    help='Your argument description'
)

答案 1 :(得分:0)

解决这个问题之后,最简单的答案是处理argprase之外的最小值或最大值的命令行输入验证。

这使得编写函数和条件来检查浮点值。如果满足条件,请退出程序:

import sys

# function to print error to stderr
def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs

# input validation
if args.L <=0:
    eprint("Input error. Length is less than 0. Please enter a positive length. Exiting.")
    sys.exit(1)

答案 2 :(得分:0)

解决方案

基于@rdas的不错的解决方案,我创建了一个新的解决方案,该解决方案允许动态指定浮点范围,应由ArgumentParser检查。

代码

def float_range(mini,maxi):
    """Return function handle of an argument type function for 
       ArgumentParser checking a float range: mini <= arg <= maxi
         mini - maximum acceptable argument
         maxi - maximum acceptable argument"""

    # Define the function with default arguments
    def float_range_checker(arg):
        """New Type function for argparse - a float within predefined range."""

        try:
            f = float(arg)
        except ValueError:    
            raise argparse.ArgumentTypeError("must be a floating point number")
        if f < mini or f > maxi:
            raise argparse.ArgumentTypeError("must be in range [" + str(mini) + " .. " + str(maxi)+"]")
        return f

    # Return function handle to checking function
    return float_range_checker

使用方法

您可以在ArgumentParser中将此函数用作动态参数类型生成器:

parser = ArgumentParser(description='%(prog)s: My programm')
parser.add_argument('--Temperature', type=float_range(8,25), 
                        help='Set target temperature between [8°C .. 25°C].')

工作原理

函数float_range(mini,maxi)创建一个局部上下文,其中minimaxi是已知变量。在此上下文函数float_range_checker()中定义了它,并返回了它的句柄。当ArgumentParser调用此函数句柄时,将恢复调用float_range()时提供的值的上下文,并且可以进行范围检查。