如何使用argprase
指定最小或最大浮点参数?我希望能够在最小浮点值和最大浮点值之间提供命令行参数。
我能找到的最接近的东西是choices
中的add_argument()
选项,但这仅指定了参数的允许值。
parser.add_argument("L", type=float, choices=range(2))
L的命令行参数0.5
失败:
invalid choice: 0.5 (choose from 0, 1)
答案 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)
创建一个局部上下文,其中mini
和maxi
是已知变量。在此上下文函数float_range_checker()
中定义了它,并返回了它的句柄。当ArgumentParser
调用此函数句柄时,将恢复调用float_range()
时提供的值的上下文,并且可以进行范围检查。