【问题标题】:How to perform an argparse subparse for [-A[-b value]] in Python如何在 Python 中为 [-A[-b value]] 执行 argparse 子解析
【发布时间】:2018-09-15 20:35:45
【问题描述】:

我想重新创建 [-A [-b value]],其中命令如下所示:

test.py -A -b 123

看起来很简单,但我做不到。我最近的尝试是:

byte = subparser.add_parser("-A")
byte.add_argument("-b", type=int)

【问题讨论】:

  • 如果您尝试使用选项名称作为参数,add_parser 可能会返回错误。
  • 确实如此,上面的代码返回,错误:无效选择:'123'(从'-A'中选择)
  • 不,我的意思是调用add_parser 本身,而不是当你调用parse_args() 时,因为这样的子命令充其量看起来是有问题的。

标签: python argparse subparsers


【解决方案1】:

虽然add_parser 命令接受“-A”,但解析器无法使用它。看帮助:

usage: ipython3 [-h] {-A} ...

positional arguments:
  {-A}

optional arguments:
  -h, --help  show this help message and exit

子解析器实际上是一种特殊的positional 参数。对于主解析器,您已经有效地定义了

add_argument('cmd', choices=['-A'])

但是对于解析代码,'-A' 看起来像一个optional's 标志,就好像你已经定义了

add_argument('-A')

错误:

error: argument cmd: invalid choice: '123' (choose from '-A')

表示它跳过了-A-b(未为主解析器定义),并尝试将'123' 解析为第一个位置。但它不在有效选择列表中。

所以要使用子解析器,你需要指定'A'作为子解析器,而不是'-A'。

【讨论】:

  • 知道了,在发布错误、无法识别的参数 -B -s 之前,我也尝试过这种方式。正如你和cheaner(上面的cmets)所提到的,我在“”中做了非正统的-A、-t等声明,但是在所有视频/教程中,我还没有看到输入>>测试的正式声明。 py -a 123 -t ph
  • 就像你说的那样 add_argument 确实允许“-A”,但是,这不会削减它
猜你喜欢
  • 1970-01-01
  • 2021-07-28
  • 2018-12-31
  • 1970-01-01
  • 2013-06-30
  • 2013-12-21
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多