当前位置: 首页 > 面试题库 >

Python argparse:是否可以在nargs中指定范围?

融宏伟
2023-03-14
问题内容

我有一个可选参数,它本身支持参数列表。

我的意思是,它应该支持:

  • -f 1 2
  • -f 1 2 3

但不是:

  • -f 1
  • -f 1 2 3 4

有没有办法在argparse中强制执行此操作?现在,我使用nargs =“ *”,然后检查列表长度。

编辑:
根据要求,我需要的是能够定义一个可接受数量的参数范围。我的意思是说(在示例中)2或3个args是正确的,但不是1或4或不在2..3范围内的任何东西


问题答案:

您可以通过自定义操作来执行此操作:

import argparse

def required_length(nmin,nmax):
    class RequiredLength(argparse.Action):
        def __call__(self, parser, args, values, option_string=None):
            if not nmin<=len(values)<=nmax:
                msg='argument "{f}" requires between {nmin} and {nmax} arguments'.format(
                    f=self.dest,nmin=nmin,nmax=nmax)
                raise argparse.ArgumentTypeError(msg)
            setattr(args, self.dest, values)
    return RequiredLength

parser=argparse.ArgumentParser(prog='PROG')
parser.add_argument('-f', nargs='+', action=required_length(2,3))

args=parser.parse_args('-f 1 2 3'.split())
print(args.f)
# ['1', '2', '3']

try:
    args=parser.parse_args('-f 1 2 3 4'.split())
    print(args)
except argparse.ArgumentTypeError as err:
    print(err)
# argument "f" requires between 2 and 3 arguments


 类似资料:
  • 我想在foreach内部的模型中传递一个数组的范围。 我重新创建了一个示例: 周围的工作 我发现是传递所有的列表,并在子视图内部执行范围。但我不想这样做,因为数组非常大:

  • 问题内容: 我正在尝试使用jQuery在特定端口上运行AJAX查询: 这不起作用:没有进行AJAX调用,并且Firebug中没有任何异常。如果我不指定端口,它确实可以工作。有人知道为什么吗? 问题答案: 由于“ 同源来源”政策而无法使用。仅在相同的域,协议和端口中才允许AJAX请求。 如果您确实需要从该来源获取数据,则应该期待JSONP。

  • 在C/C中,可以对SIMD(如AVX和AVX2)指令使用内部函数。有没有办法在Rust中使用SIMD?

  • 问题内容: 我希望能够根据其他两个IP范围内的IP返回true / false。 例如: 结果应为true。 其他例子: 问题答案: 检查范围的最简单方法可能是将IP地址转换为32位整数,然后比较这些整数。 而不是,您可能想要查看具有InetAddresses帮助器类的Guava库,该类避免了DNS查找的可能性。

  • 问题内容: 这是我的代码示例: 是否可以使用我的paxkage(bio)中的函数而无需指定包名称: ? 问题答案: 您可以将其用作导入声明,例如: 如果出现显式的句号()而不是名称,则在该软件包的package块中声明的所有软件包导出的标识符都将在导入源文件的file块中声明,并且 必须在不使用限定符的情况下进行访问 。 这就是像govey这样的测试框架所做的: 您不需要使用,或者由于导入以’开头

  • 是否可以使用< code>-P参数来限制要公开的端口范围,例如: 或