Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的解析参数_Python_Parsing_Command Line Interface_Argparse - Fatal编程技术网

python中的解析参数

python中的解析参数,python,parsing,command-line-interface,argparse,Python,Parsing,Command Line Interface,Argparse,我有一个问题,我正试图找到解决办法。我不确定我是否能用argparse完成它 我希望能够指定一个选项 myprog -a 1 myprog -a 2 现在,当我有a=1时,我希望能够指定b和c。但是当a=2时,我只能指定d 另外,必须始终指定a最简单的解决方案是将'-a'arequired=True参数设为,并将其他参数设为默认值notrequired。然后在解析之后,对aargs.a和其他值执行测试(我假设您可以编写这种Python逻辑) 您可以提出自己的错误,也可以使用parser.err

我有一个问题,我正试图找到解决办法。我不确定我是否能用argparse完成它

我希望能够指定一个选项

myprog -a 1
myprog -a 2
现在,当我有a=1时,我希望能够指定bc。但是当a=2时,我只能指定d


另外,必须始终指定a

最简单的解决方案是将
'-a'
a
required=True
参数设为
,并将其他参数设为默认值notrequired。然后在解析之后,对a
args.a
和其他值执行测试(我假设您可以编写这种Python逻辑)

您可以提出自己的错误,也可以使用
parser.error(“我不喜欢您的输入”)
调用

您需要编写一个自定义的
用法
行。考虑到这些要求,什么是有意义的用法

有一个互斥的
参数组
方法,但它不使用特定的值,只使用参数的存在与否

您还可以将测试合并到自定义操作类中。但通常这比解析后执行测试更复杂(因为argparse处理以任何顺序出现的参数)


-a
参数转换为子参数的另一种可能性。这允许您为一个“解析器”值定义一组参数,为另一个值定义另一组参数。我认为argparse文档在这方面已经足够清楚了。

您不能将切换值作为单个
parse_args
调用来执行,但您可以执行以下操作之一:

  • 使用
  • 在完全配置解析器并在完整的命令行上运行之前,先执行部分解析,首先只检查
    a
    ,然后根据第一次调用的结果选择要解析的其他解析器参数。诀窍是用于第一个调用,因此它处理
    a
    (它可以识别)并忽略其他所有内容
  • 例如,对于方法2,您可以执行以下操作:

    parser = argparse.ArgumentParser()
    parser.add_argument('-a', required=True, type=int, choices=(1, 2)
    args = parser.parse_known_args()
    
    if args.a == 1:
        parser.add_argument('-b', ...)
        parser.add_argument('-c', ...)    
        args = parser.parse_args()
    else:
        parser.add_argument('-d', ...)
        args = parser.parse_args()
    
    这种方法的缺点是,由于不正确使用而吐出的使用信息将是不完整的;您必须手动将指定“真实”用法的文本包含在基本解析器中,这一点都不有趣。子Parser不能基于值开关进行切换,但它们具有统一、一致的使用显示

    parser = argparse.ArgumentParser()
    parser.add_argument('-a', required=True, type=int, choices=(1, 2)
    args = parser.parse_known_args()
    
    if args.a == 1:
        parser.add_argument('-b', ...)
        parser.add_argument('-c', ...)    
        args = parser.parse_args()
    else:
        parser.add_argument('-d', ...)
        args = parser.parse_args()