Python argparse 可选破折号整数参数
Python argparse optional dash-integer argument
是否可以添加一个带有 argparse 的可选参数 as -,
类似于 unix head
和 tail
命令接受 - 表示要打印多少行,
或类似于 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 标准之上,通过 getopt
和 optparse
模块继承。
是否可以添加一个带有 argparse 的可选参数 as -
类似于 unix head
和 tail
命令接受 -
或类似于 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 标准之上,通过 getopt
和 optparse
模块继承。