5

我知道以前有人问过类似的问题,但我真的找不到确切的问题(而且,我无法理解“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()

所以只有在is-f时才需要该参数,否则不应解析它-modedownload

4

2 回答 2

8

一般来说,你应该避免使--optionsrequired。在这种情况下,我建议如下:

  1. 替换--mode为子命令。
  2. 替换-d为位置参数
  3. 仅替换-fdownload命令的第二个位置参数。

如果你真的想要,你可以保留-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用于在最终解析的参数中标记使用了哪个命令的调用。

于 2013-09-09T22:59:04.260 回答
6

那这个呢?

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
于 2013-09-09T22:52:41.173 回答