Python argparse 可选破折号整数参数 在 Python 中是否有通用和/或可接受的方法来执行此操作?

如何解决Python argparse 可选破折号整数参数 在 Python 中是否有通用和/或可接受的方法来执行此操作?

是否可以使用 argparse 添加可选参数为 -,

类似于 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 中是否有通用和/或可接受的方法来执行此操作?

谢谢。

解决方法

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 建立在通过 getoptoptparse 模块继承的 POSIX 标准之上。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?