【问题标题】:Don't require all the positional arguments if an optional argument is present如果存在可选参数,则不需要所有位置参数
【发布时间】:2017-04-04 05:24:35
【问题描述】:

我有以下sn-p:

parser = argparse.ArgumentParser()
parser.add_argument("a") # always required
parser.add_argument("x") # don't required in case -t option is chosen
parser.add_argument("y") # don't required in case -t option is chosen
parser.add_argument("z") # don't required in case -t option is chosen
parser.add_argument("-t", "--tt")
args = parser.parse_args()

关键是,如果指定了-t 选项,我不需要位置参数xyz

【问题讨论】:

  • 你能举一些你想如何调用命令的例子吗?似乎 x y z 是 -t 的必需参数,而不是位置参数本身?
  • 投反对票,因为您似乎可以将参数设为可选,然后如果未给出 -t,请手动检查它们。

标签: python command-line-arguments argparse


【解决方案1】:

您可以使用parse_known_args 实现您想要的。基本上,这意味着您可以部分解析 args,一次查看是否得到 -t,然后再次获取剩余的 args。

例如:

test.py

import argparse

parser1 = argparse.ArgumentParser()
parser1.add_argument("a")  # always required
parser1.add_argument("-t", "--tt", default=False, action='store_true')
args1 = parser1.parse_known_args()

if args1[0].tt:
    print('got t')
else:
    parser2 = argparse.ArgumentParser()
    parser2.add_argument("x")
    parser2.add_argument("y")
    parser2.add_argument("z")
    args2 = parser2.parse_args(args1[1])
    print('got all args')

叫它:

$ python test.py a -t
got t
$ python test.py a
usage: test.py [-h] x y z
test.py: error: too few arguments
$ python test.py a b c d
got all args

您可能希望修改usage 字符串,以确保您得到一些理智的东西。像这样,您可以构建非常强大的 CLI,但强大的功能会给您的用户带来巨大的责任:-)。

【讨论】:

    【解决方案2】:

    您不能根据是否提供另一个参数来使命名参数成为可选参数。不过,您可以为位置参数执行此操作。考虑一下:

    parser = argparse.ArgumentParser()
    parser.add_argument("a") # always required
    parser.add_argument("-t", "--tt", nargs=3)  # Expects 3 arguments if -t
    args = parser.parse_args()
    
    if args.tt:
        x, y, z = args.tt
        print(x, y ,z)
    

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 2017-03-24
      • 2012-06-23
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多