Python 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

我正在开发一个包含几个python脚本的工具箱。对于其中几个参数,一些参数可能是数值。根据脚本的不同,某些脚本可能要求v值介于-1和1之间,或0和1之间,或1和10之间,或。。。例如,输出图的页面宽度应始终为正值

我可以随时检查v是否在要求的范围内。我还可以使用argparse为每个范围定义一个动作或一个类型。使用新类型给出了一个示例:

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