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

时间:2013-09-09 22:45:41

标签: python command-line-arguments argparse

我知道之前已经提出了类似的问题,但我找不到一个确切的问题(另外,我无法理解'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 个答案:

答案 0 :(得分:6)

通常,您应该避免要求--options。在这种情况下,我建议如下:

  1. --mode替换为子命令。
  2. -d替换为位置参数
  3. 仅将-f替换为download命令的第二个位置参数。
  4. 如果你真的想,你可以保留-d-f,而不是让它们成为位置参数。

    您的来电将如下所示:

    ./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用于在最终解析的参数中标记使用了哪个命令。

答案 1 :(得分:5)

这个怎么样?

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