Python argparse-使用附加参数定义自定义操作或类型
我正在开发一个包含几个python脚本的工具箱。对于其中几个参数,一些参数可能是数值。根据脚本的不同,某些脚本可能要求v值介于-1和1之间,或0和1之间,或1和10之间,或。。。例如,输出图的页面宽度应始终为正值 我可以随时检查v是否在要求的范围内。我还可以使用argparse为每个范围定义一个动作或一个类型。使用新类型给出了一个示例:Python argparse-使用附加参数定义自定义操作或类型,python,argparse,Python,Argparse,我正在开发一个包含几个python脚本的工具箱。对于其中几个参数,一些参数可能是数值。根据脚本的不同,某些脚本可能要求v值介于-1和1之间,或0和1之间,或1和10之间,或。。。例如,输出图的页面宽度应始终为正值 我可以随时检查v是否在要求的范围内。我还可以使用argparse为每个范围定义一个动作或一个类型。使用新类型给出了一个示例: def positive_num(a_value): """Check a numeric positive.""" if not a_valu
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)
现在,如果该值是一个相关系数(或某个范围内的任何值),是否可以使用action或Type编写更通用的内容,使用:
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
我试过几种方法,但没有成功
谢谢每:
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
def ranged_num(最低=1,最高=1):
“”“检查数字是否在预期范围内。”“”
def type_func(一个值):
a_值=int(a_值)#或“float”;您也可以在这里进行错误处理
如果不是(a_值>=最小值和a_值),则需要一个高阶函数来执行此操作,一个返回函数的函数。type
需要是一个接受单个(注意:string)参数的函数,所以这就是ranged_num(-1,1)
需要返回。是的……就是这样。我将深入探讨。问题是如何将范围(-1,1)传递给这个高阶函数,因为通常的方法是传递函数定义,而不是传递函数调用到add_argument()的类型参数方法。我记得我不想为每个范围编写特定的函数。这是高阶函数的要点;返回type
函数的函数也可以获取参数。您可以编写type=ranged\u num(-1,1)
,该函数将返回一个接受字符串参数的适当配置函数。functools.partial
可用于绑定ranged\u num
的low
和high
。我已经准备好了。没有考虑到在type\u funct中可以看到的最低和最高值这一事实……非常感谢或者这一课。Best@user451460不用担心,如果你想了解更多的信息,这被称为“结束”,这也更适合使用或…谢谢。
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