我正在开发一个包含几个python脚本的工具箱。对于其中几个,某些参数可能是数字值。根据脚本的不同,有些可能要求v介于-1与1之间,或者0与1之间,或1与10之间,或者...。例如,输出图中的页面宽度应该始终为正。
我可以一直检查v是否在要求的范围内。我还可以为每个范围使用argparse定义一个Action或一个类型。使用新类型给出了一个示例:
def positive_num(a_value):
"""Check a numeric positive."""
if not a_value > 0:
raise argparse.ArgumentTypeError("Should be positive.")
return a_value
并稍后将其添加到解析器中:
parser_grp.add_argument('-pw', '--page-width',
help='Output pdf file width (e.g. 7 inches).',
type=positive_num,
default=None,
required=False)
现在,如果值是一个相关系数(或范围内的任何值),则可以使用动作或类型使用以下方式写一些更通用的东西:
def ranged_num(a_value, lowest=-1, highest=1):
"""Check a numeric is in expected range."""
if not (a_value >= lowest and a_value <= highest):
raise argparse.ArgumentTypeError("Not in range.")
return a_value
以后可以像这样添加:
parser_grp.add_argument('-c', '--correlation',
help='A value for the correlation coefficient',
type=ranged_num(-1,1),
default=None,
required=False)
我尝试了几种方法,但都没有成功。
谢谢
答案 0 :(得分:3)
type=
可以接受任何带有单个字符串参数的可调用对象,并且 返回转换后的值
因此,要像type=ranged_num(-1,1)
一样使用它,您的ranged_num
函数必须返回一个函数本身。返回一个函数(或接受一个函数作为参数,或两者兼有)的函数通常称为“高阶函数”。
这是一个最小的例子:
def ranged_num(lowest=-1, highest=1):
"""Check a numeric is in expected range."""
def type_func(a_value):
a_value = int(a_value) # or "float"; you could also have error handling here
if not (a_value >= lowest and a_value <= highest): # I'd rewrite this to an "or"
raise argparse.ArgumentTypeError("Not in range.")
return a_value
return type_func
现在ranged_num
创建并返回一个函数type_func
,该函数负责处理来自命令行的字符串。