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

Ear*_*ome 7 python argparse

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

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

parser.add_argument("L", type=float, choices=range(2))
Run Code Online (Sandbox Code Playgroud)

0.5L的命令行参数失败:

invalid choice: 0.5 (choose from 0, 1)
Run Code Online (Sandbox Code Playgroud)

Geo*_* W. 12

解决方案

\n

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

\n

代码

\n
import argparse\n\ndef float_range(mini,maxi):\n    """Return function handle of an argument type function for \n       ArgumentParser checking a float range: mini <= arg <= maxi\n         mini - minimum acceptable argument\n         maxi - maximum acceptable argument"""\n\n    # Define the function with default arguments\n    def float_range_checker(arg):\n        """New Type function for argparse - a float within predefined range."""\n\n        try:\n            f = float(arg)\n        except ValueError:    \n            raise argparse.ArgumentTypeError("must be a floating point number")\n        if f < mini or f > maxi:\n            raise argparse.ArgumentTypeError("must be in range [" + str(mini) + " .. " + str(maxi)+"]")\n        return f\n\n    # Return function handle to checking function\n    return float_range_checker\n
Run Code Online (Sandbox Code Playgroud)\n

如何使用

\n

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

\n
parser = ArgumentParser(description='%(prog)s: My programm')\nparser.add_argument('--Temperature', type=float_range(8,25), \n                        help='Set target temperature between [8\xc2\xb0C .. 25\xc2\xb0C].')\n
Run Code Online (Sandbox Code Playgroud)\n

怎么运行的

\n

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

\n


rda*_*das 10

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

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'
)
Run Code Online (Sandbox Code Playgroud)