【问题标题】:Python Argparse parse_known_args fails when short options are joined加入短选项时,Python Argparse parse_known_args 失败
【发布时间】:2018-03-21 15:13:30
【问题描述】:

我正在使用 argparse.ArgumentParser.parse_known_args 在提供给外部实用程序的命令行上执行一些启发式方法,同时仅在我的 Python 代码中指定其语法的相关部分。但是,当已知和未知参数以简短形式给出并结合在一起时(如ls -lh),它不会检测到它们。 示例:

import argparse
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-x', action='store_true')
parser.add_argument('-y', action='store_true')
parser.parse_known_args(['-xy', '-z'])  # OK, gives: (Namespace(x=True, y=True), ['-z']
parser.parse_known_args(['-xyz'])       # Fails with: PROG: error: argument -y: ignored explicit argument 'z'

有没有办法让它在这种情况下做出更好的启发式?

【问题讨论】:

    标签: python command-line-arguments argparse


    【解决方案1】:

    我在https://bugs.python.org/issue32756回复了类似的问题。

    正如我在argparse 中指出的那样,文档不承诺按您的意愿处理这种类型的输入:

    来自文档,16.4.4.1。选项值语法

    对于短选项(选项只有一个字符长),选项及其值可以连接:

    几个短选项可以连接在一起,只使用一个 - 前缀,只要只有最后一个选项(或它们都不需要)需要一个值:

    在您的情况下,“z”既不是空头期权,也不是空头期权的价值,因此被拒绝。

    所以是的,预处理输入是唯一的选择。


    '-xyz' 其中'-x' 和'-y' 是已知的,但'z' 不是本质上是模棱两可的。是'-x -y -z','-x -y z','-x -y=z'。 argparse 提出错误而不是做出这些假设之一。

    【讨论】:

      【解决方案2】:

      我通过编写一个函数来分离聚集在一起的参数(带有一些简化的假设)来解决这个问题:

      import itertools
      import re
      
      def normalizeShortFormArgs(args):
          "Separate short form args clustered together (as in 'ls -lh') into individual args (as in 'ls -l -h')"
          shortArgsRe = re.compile(r"\-(\w+)")
          def normalizeToken(argToken):
              m = shortArgsRe.match(argToken)
              if m is None:
                  return (argToken,)
              else:
                  return ("-" + c for c in m.group(1))
      
          return type(args)(itertools.chain.from_iterable(map(normalizeToken, args)))
      
      # Example: normalizeShortFormArgs(["-k", "-lhZ", "-", "--other"])
      # Gives: ['-k', '-l', '-h', '-Z', '-', '--other']
      

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-21
        • 2016-08-11
        • 2013-07-06
        • 1970-01-01
        相关资源
        最近更新 更多