使用Python argparse命名参数

使用Python argparse命名参数,python,argparse,Python,Argparse,我正在尝试创建一个类似于cutechess cli的终端应用程序,该应用程序具有以下选项: -epdout FILE将游戏的结束位置保存为FEN格式的文件。 -恢复重新启动崩溃的引擎,而不是停止比赛 -重复[N]播放每个开头两次(或N次)。除非-noswap。。。 这一切都可以通过Python中的argparse完成 但是,它也有如下“命名参数”: -movecount=COUNT score=score[twosided=VALUE] 如果引擎的得分为0,则判定游戏为失败 至少有百分之八十的

我正在尝试创建一个类似于cutechess cli的终端应用程序,该应用程序具有以下选项:

-epdout FILE将游戏的结束位置保存为FEN格式的文件。
-恢复重新启动崩溃的引擎,而不是停止比赛
-重复[N]播放每个开头两次(或N次)。除非-noswap。。。
这一切都可以通过Python中的
argparse
完成

但是,它也有如下“命名参数”:

-movecount=COUNT score=score[twosided=VALUE]
如果引擎的得分为0,则判定游戏为失败
至少有百分之八十的棋子在零以下至少计数
连续动作。
-sprt elo0=elo0 elo1=elo1α=αβ=β
使用顺序概率比测试作为终止
比赛的标准。此选项应仅用于。。。
我可以使用
argparse
实现它,使用
nargs='*'
然后编写我自己的解析器(可能只是regex)。然而,这并不能提供很好的文档,如果
argparse
已经可以做类似的事情,那么我将很少使用内置方法

小结:
argparse
是否有类似于上述
resit
sprt
的命名参数的概念?如果不是,最好的方法是使用
nargs='*'
来实现这一点吗?

您可以使用自定义来拆分值,并使用
metavar
参数来更好地描述值:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--arg', nargs='*', type=lambda text: text.split('=', maxsplit=1), metavar='PARAM-NAME=PARAM-VALUE', help='Some other parameters')
args = parser.parse_args()
args.arg = {k: v for k,v in args.arg}
产生:

usage: [-h] [--arg [PARAM-NAME=PARAM-VALUE [PARAM-NAME=PARAM-VALUE ...]]]

optional arguments:
  -h, --help            show this help message and exit
  --arg [PARAM-NAME=PARAM-VALUE [PARAM-NAME=PARAM-VALUE ...]]
                        Some other parameters

如果您愿意,您可以通过使用自定义字典来避免构建字典的“后处理”步骤。但是,在这种情况下,我觉得这是一种过分的做法。

如果我正确理解了您的问题,我认为您正在寻找一个
nargs=3
,解析后解压列表值:
COUNT,SCORE,value=args.demit
。并按图所示编写
帮助
行。虽然您可以使用
类型
操作
做一些奇特的事情,但在解析后处理这些值通常更简单。@Tomerikoo这会给我
cmd.py dimit-movecount 40-score 500 sprt-elo 100-elo 1200
。我想这在某种程度上是相似的,但我觉得子parser更常用于单独的程序,比如
git-rebase
git-stash
等@hpaulj可以工作,但是参数不会被命名。在文档中,这并不重要,但是在一个长的命令行中,有名字是很好的。这是一个非常好的解决方案!制作自己的
Action
type是否允许我重写metavars以显示多个可选值?比如
A=X[B=Y][C=Z]