如何解决Python argparse 可选破折号整数参数 在 Python 中是否有通用和/或可接受的方法来执行此操作?
是否可以使用 argparse 添加可选参数为 -
类似于 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 中是否有通用和/或可接受的方法来执行此操作?
谢谢。
解决方法
argparse
不支持动态选项名称。
来源:我试图做你问的同样的事情。
您可以自己完成任务,但它必须在 argparse
之前或之后运行,并且必须修改 sys.argv
。这使得解决方案的一半将回避 argparse
。我建议你尝试寻找一个支持这种参数传递方式的库。
试图接受破折号作为参数标志会产生歧义。它们什么时候应该被解释为负数,什么时候应该被解释为标志?此外 argparse
不允许“动态”或模式;您已经定义了每个标志。
通常将“-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
建立在通过 getopt
和 optparse
模块继承的 POSIX 标准之上。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。