代码之家  ›  专栏  ›  技术社区  ›  Lyman Zerga

根据初始参数的值向argparse添加参数

  •  5
  • Lyman Zerga  · 技术社区  · 11 年前

    我知道以前也问过类似的问题,但我真的找不到确切的问题(此外,我不理解“nargs”或“subparse”的概念,以及它将如何应用于我的案例)

    我想要这样的东西:

    parser = argparse.ArgumentParser()
    parser.add_argument('-mode', choices=['download', 'upload'], required=True)
    parser.add_argument('-d', required=True)
    args = parser.parse_args()
    if args.mode == 'download':
        parser.add_argument('-f', required=True)
    
    args = parser.parse_args()
    

    所以 -f 只有当 -mode download 否则不应对其进行解析

    2 回复  |  直到 10 年前
        1
  •  8
  •   chepner    11 年前

    一般来说,你应该避免 --options 必修的。在这种情况下,我建议如下:

    1. 代替 --mode 使用子命令。
    2. 代替 -d 带有位置参数
    3. 代替 -f 带有的第二个位置参数 download 仅限命令。

    如果你真的想,你可以保留 -天 -如果 而不是让它们成为位置论点。

    您的通话内容如下:

    ./script.py upload d-argument
    ./script.py download d-argument f-argument
    

    ./script.py upload -d foo
    ./script.py download -d foo -f bar
    

    要实现的代码有点乏味,但相当简单。

    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()
    upload_parser = subparsers.add_parser('upload')
    download_parser = subparsers.add_parser('download')
    upload_parser.set_defaults(cmd='upload')
    download_parser.set_defaults(cmd='download')
    for p in [ upload_parser, download_parser ]:
        p.add_argument("d")
        # p.add_argument("-d", required=True)
    download_parser.add_argument("f")
    # download_parser.add_argument("-f", required=True)
    
    
    args = parser.parse_args()
    if args.cmd == 'upload':
        # handle upload with args.d
    elif args.cmd == 'download':
        # handle download with args.d and args.f
    

    记下对的呼叫 set_defaults 用于在最终解析的参数中标记使用了哪个命令。

        2
  •  6
  •   alecxe    11 年前

    这个怎么样?

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-mode', choices=['download', 'upload'], required=True)
    parser.add_argument('-d', required=True)
    parser.add_argument('-f')
    
    args = parser.parse_args()
    if args.mode == 'download' and not args.f:
        parser.error('-f argument is required in "download" mode.')
    

    演示:

    $ python test.py -mode=upload -d 10
    $ python test.py -mode=download -d 10
    usage: test.py [-h] -mode {download,upload} -d D [-f F]
    test.py: error: -f argument is required in "download" mode.
    $ python test.py -mode=download -d 10 -f 10