【问题标题】:Arguments that are dependent on other arguments with Argparse依赖于 Argparse 的其他参数的参数
【发布时间】:2015-02-09 06:04:35
【问题描述】:

我想完成这样的事情:

-LoadFiles
    -SourceFile "" -DestPath ""
    -SourceFolder "" -DestPath ""
-GenericOperation
    -SpecificOperation -Arga "" -Argb ""
    -OtherOperation -Argc "" -Argb "" -Argc ""

用户应该能够运行以下内容:

-LoadFiles -SourceFile "somePath" -DestPath "somePath"

-LoadFiles -SourceFolder "somePath" -DestPath "somePath"

基本上,如果您有-LoadFiles,则后面必须有-SourceFile-SourceFolder。如果你有-SourceFile,你必须有-DestPath等。

其他参数所需的参数链是否可能?如果没有,我至少可以做类似的事情,如果你有-SourceFile,你必须有-DestPath

【问题讨论】:

标签: python argparse


【解决方案1】:

您可以在 argparse 中使用子解析器

 import argparse
 parser = argparse.ArgumentParser(prog='PROG')
 parser.add_argument('--foo', required=True, help='foo help')
 subparsers = parser.add_subparsers(help='sub-command help')

 # create the parser for the "bar" command
 parser_a = subparsers.add_parser('bar', help='a help')
 parser_a.add_argument('bar', type=int, help='bar help')
 print(parser.parse_args())

【讨论】:

    【解决方案2】:

    在您创建的ArgumentParser 实例上调用parse_args 后,它会给您一个Namespace 对象。只需检查一个参数是否存在,那么另一个参数也必须存在。喜欢:

    args = parser.parse_args()
    if ('LoadFiles' in vars(args) and 
        'SourceFolder' not in vars(args) and 
        'SourceFile' not in vars(args)):
    
        parser.error('The -LoadFiles argument requires the -SourceFolder or -SourceFile')
    

    【讨论】:

    • 我猜@Feuermurmel 意味着这个答案需要改进。
    • 我更喜欢@saeed-gharedag​​hi 的回答。
    • 虽然这行得通,但如果添加其他选项并不灵活,@saeed-gharedag​​hi 的回答允许这样做
    【解决方案3】:

    这是一个示例,如果您指定 --makeDependency,则会强制您也指定 --dependency 和一个值。

    这不仅仅由 argparse 完成,还由稍后验证用户指定内容的程序完成。

    #!/usr/bin/env python
    import argparse
    import sys
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--makeDependency', help='create dependency on --dependency', action='store_true')
    parser.add_argument('--dependency', help='dependency example')
    
    args = parser.parse_args()
    
    if args.makeDependency and not args.dependency:
        print "error on dependency"
        sys.exit(1)
    
    print "ok!"
    

    【讨论】:

    • 将错误消息写入stderr sys.stderr.write('error on dependency')的最佳实践
    【解决方案4】:

    有一些argparse 替代方案,您可以轻松管理您提到的案例。 包如: clickdocopt.

    如果我们想绕过 argparse 中链参数的手动实现,请查看 click 中的 Commands and Groups 示例。

    【讨论】:

      猜你喜欢
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 2022-11-14
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多