【问题标题】:Parsing only optional arguments with argparse仅使用 argparse 解析可选参数
【发布时间】:2018-06-26 06:15:14
【问题描述】:

我遇到了 argparse 的可选参数的问题。我希望能够在命令行上设置整数参数以及像这样的真/假标志

python3 create.py k=7 split=9

我的问题是 argparse 忽略等号并将这些参数视为 [k=7,split=9]。如您所见,它们最终成为字符串而不是我想要的整数。如何在命令行上指定我想要的参数是什么整数?

为了记录,这就是我的代码的样子

parser = argparse.ArgumentParser()
parser.add_argument('k', nargs='?', default=6)
parser.add_argument('split', nargs='?', default=0.67)
arg = parser.parse_args()

【问题讨论】:

标签: python python-3.x command-line-arguments argparse


【解决方案1】:

argparse 术语中,有positionalsoptionals? nargs 允许 positional 不是必需的(可选),但它仍然是 positional。相反,optional 可能有一个required=True 参数,但它仍然是一个optional,就拿一个标志而言。是的,这个术语很尴尬,但它有一段历史,我们坚持下去。为避免混淆,我喜欢谈论 flagged 参数而不是 optionals

= 输入仅适用于标记参数,例如:

In [68]: parser = argparse.ArgumentParser();
In [69]: parser.add_argument('-k', nargs='?')
Out[69]: _StoreAction(option_strings=['-k'], dest='k', nargs='?', const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [70]: parser.add_argument('--split', nargs='?');
In [71]: parser.parse_args('-k=7 --split=9'.split())
Out[71]: Namespace(k='7', split='9')

根据您的定义,ksplit 仍然是位置参数,即使使用 ? nargs。他们不拿旗帜。您必须通过以下方式调用它们:

python3 create.py 7 9

只有一个字符串

python3 create.py 7

只有第一个,k 得到一个值; split 获取默认值。没有办法,用位置,设置split 而不是k。值按位置解析。

【讨论】:

  • 我在理解您回答的第一部分时遇到了一些麻烦。特别是前3句话。我也很难相信没有办法做到这一点。我以前在代码中看到过这样做,我只是不记得他们是如何完成的
  • 关于处理一般的key=value 字符串有很多问题。虽然答案在细节上有所不同,但基本思想是您必须自己解析此类字符串 - 拆分为 '=' 等。如果您只想解析这些,请跳过 argparse 并直接使用 sys.argv
猜你喜欢
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 2015-12-26
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 2020-09-26
相关资源
最近更新 更多