Python argparse 可选破折号整数参数

Python argparse optional dash-integer argument

是否可以添加一个带有 argparse 的可选参数 as -,

类似于 unix headtail 命令接受 - 表示要打印多少行,
或类似于 git log 接受 - 表示要打印多少日志条目?

例如,

head -4     # print four lines
tail -12    # print 12 lines.
git log -7  # print 7 log entries

而参数 可选的,例如这些都有效:

head        # print default number of lines
tail        # print default number of lines
git log     # print all log entries through system pager

在 Python 中是否有通用的 and/or 可接受的方法来做到这一点?

谢谢。

argparse 不支持动态选项名称。

资料来源:我试着做你问的同样的事情。

您可以自己完成任务,但它必须在 argparse 之前或之后完成 运行,并且必须修改 sys.argv。这使得一半的解决方案将回避 argparse。我建议你尝试找到一个支持这种参数传递方式的库。

尝试接受破折号作为参数标志会产生歧义。什么时候应该将它们解释为负数,什么时候应该解释为标志?此外 argparse 不允许 'dynamic' 或模式;你已经定义了每个标志。

通常 '-2' 被解析为一个值 - 如果类型是 int:

In [250]: p=argparse.ArgumentParser()
In [251]: p.add_argument('foo', type=int);
In [252]: p.parse_args(['-2'])
Out[252]: Namespace(foo=-2)

我们可以定义一个带有数字字符的标志:

In [253]: p.add_argument('-3','--third');
In [254]: p.parse_args(['2'])
Out[254]: Namespace(foo=2, third=None)

禁用负数:

In [255]: p.parse_args(['-2'])
usage: ipython3 [-h] [-3 THIRD] foo
ipython3: error: the following arguments are required: foo

In [257]: p.parse_args('-3 xxx 3'.split())
Out[257]: Namespace(foo=3, third='xxx')

In [260]: p.parse_args('-3 -1 3'.split())
usage: ipython3 [-h] [-3 THIRD] foo
ipython3: error: argument -3/--third: expected one argument

根据gnu-unix/linux,您想要的模式已过时

https://www.gnu.org/software/coreutils/manual/html_node/head-invocation.html

通常行指定为:

‘-n [-]num’

其中负值从末尾开始计数(如同 Python 中的负切片)。

For compatibility head also supports an obsolete option syntax -[num][bkm][cqv]

像这样的实用程序的早期版本直接(在 C 代码中)使用作者认为方便的任何语法(从编码的角度来看与最终用法一样)解析命令行值。您也可以按照其他答案中的指示进行操作。但随着系统的成熟,开发人员使用了像 getopt 这样的解析器,并试图标准化使用。
https://www.gnu.org/software/coreutils/manual/html_node/Common-options.html#Common-options

通常 argparse 建立在 POSIX 标准之上,通过 getoptoptparse 模块继承。