argparse 中单破折号和双破折号的区别

Difference between single dash and double dash in argparse

有谁知道用单破折号 -r 和双破折号 --r 指定 argparse 参数之间的主要区别是什么?

我遇到了 this Julia 语言 argparse,它将它们分为短和长,但没有说明为什么你会使用一个而不是另一个。

如果按照通常的约定,单个破折号参数只包含一个字符,因此,-abc 等同于 -a -b -c。带有双破折号的参数名称被视为整个单词,因此 --abc 只是一个名为 abc.

单个 参数

--foo 这样的长选项来自 GNU tradition:

GNU adds long options to these conventions. Long options consist of ‘--’ followed by a name made of alphanumeric characters and dashes. Option names are typically one to three words long, with hyphens to separate words. Users can abbreviate the option names as long as the abbreviations are unique.

同时支持空头选项 -f 和空头选项 --foo 是很常见的。双破折号 -- 用于区分多头期权和一组空头期权。通常,您可以同时写

go -a -b -c 

或浓缩形式

go -abc

不同
go --abc

这是一个不同的选项。

虽然 argparse 支持可以使用单个字母指定多个短选项(使用单破折号)的约定,例如,-abc 可以是指定 -a -b -c 的更短方式,argparse 也允许非常规地使用带有单破折号选项的单词,这会导致一些短形式由于歧义而无法使用:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-ab', action='store_true')
parser.add_argument('-ac', action='store_true')
parser.add_argument('-b', action='store_true')
parser.add_argument('-c', action='store_true')
parser.add_argument('-bczzz', action='store_true')
parser.add_argument('-z', action='store_true')
args = parser.parse_args()
print(args)
$ python3 parse.py -a
usage: parse.py [-h] [-ab] [-ac] [-b] [-c] [-bczzz] [-z]
parse.py: error: ambiguous option: -a could match -ab, -ac

$ python3 parse.py -ab
Namespace(ab=True, ac=False, b=False, bczzz=False, c=False, z=False)

$ python3 parse.py -abz
usage: parse.py [-h] [-ab] [-ac] [-b] [-c] [-bczzz] [-z]
parse.py: error: unrecognized arguments: -abz

$ python3 parse.py -bc
usage: parse.py [-h] [-ab] [-ac] [-b] [-c] [-bczzz] [-z]
parse.py: error: ambiguous option: -bc could match -b, -bczzz

$ python3 parse.py -cb
Namespace(ab=False, ac=False, b=True, bczzz=False, c=True, z=False)

$ python3 parse.py -bczz
usage: parse.py [-h] [-ab] [-ac] [-b] [-c] [-bczzz] [-z]
parse.py: error: ambiguous option: -bczz could match -b, -bczzz