- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试编写一个函数 wo,您可以通过 argparse 解析可变数量的参数 - 我知道我可以通过 nargs="+"
来做到这一点。遗憾的是,argparse 帮助的工作方式(以及人们通常在 CLI 中编写参数的方式)将位置参数放在最后。这导致我的位置参数被捕获为可选参数的一部分。
#!/usr/bin/python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("positional", help="my positional arg", type=int)
parser.add_argument("-o", "--optional", help="my optional arg", nargs='+', type=float)
args = parser.parse_args()
print args.positional, args.optional
以 ./test.py -h
运行它会显示以下使用说明:
usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] positional
但是如果我运行 ./test.py -o 0.21 0.11 0.33 0.13 100
给我
test.py: error: too few arguments
为了正确解析 args,我必须运行 ./test.py 100 -o 0.21 0.11 0.33 0.13
那么我该如何:
使 argparse 重新格式化使用输出,以减少误导,或者甚至更好:
如果可选参数 -o
是列表中的最后一个元素,则告诉 argparse 不要捕获最后一个元素
?
最佳答案
有一个错误报告:http://bugs.python.org/issue9338
argparse optionals with nargs='?', '*' or '+' can't be followed by positionals
一个简单的(用户)修复方法是使用 --
将 postionals 与 optionals 分开:
./test.py -o 0.21 0.11 0.33 0.13 -- 100
我写了一个补丁,保留了一些参数供位置使用。但这不是微不足道的。
至于改变用法行——最简单的是自己写,例如:
usage: test.py [-h] positional [-o OPTIONAL [OPTIONAL ...]]
usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] -- positional
我不建议向用法格式化程序添加逻辑来进行此类更改。我认为它会变得太复杂。
另一个快速解决方法是将此位置转换为(必需)可选。它为用户提供了关于他们的订单的完全自由,并可能减少混淆。如果您不想混淆“必需的可选”,只需给它一个合乎逻辑的默认值即可。
usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] -p POSITIONAL
usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] [-p POS_WITH_DEFAULT]
Help_Formatter 的一个简单更改是简单地按照定义的顺序列出参数。修改格式化程序行为的正常方法是将其子类化,并更改一两个方法。这些方法中的大多数都是“私有(private)的”(_ 前缀),因此您这样做时要意识到 future 的代码可能会(缓慢地)发生变化。
在此方法中,actions
是参数列表,按照它们被定义的顺序排列。默认行为是将“optionals”从“positionals”中拆分出来,并在末尾重新组合列表。还有其他代码可以处理需要换行的长行。通常它将位置放在单独的行上。我已经省略了。
class Formatter(argparse.HelpFormatter):
# use defined argument order to display usage
def _format_usage(self, usage, actions, groups, prefix):
if prefix is None:
prefix = 'usage: '
# if usage is specified, use that
if usage is not None:
usage = usage % dict(prog=self._prog)
# if no optionals or positionals are available, usage is just prog
elif usage is None and not actions:
usage = '%(prog)s' % dict(prog=self._prog)
elif usage is None:
prog = '%(prog)s' % dict(prog=self._prog)
# build full usage string
action_usage = self._format_actions_usage(actions, groups) # NEW
usage = ' '.join([s for s in [prog, action_usage] if s])
# omit the long line wrapping code
# prefix with 'usage:'
return '%s%s\n\n' % (prefix, usage)
parser = argparse.ArgumentParser(formatter_class=Formatter)
这会产生如下用法行:
usage: stack26985650.py [-h] positional [-o OPTIONAL [OPTIONAL ...]]
关于python - Argparse - 不要用 `nargs` 捕获位置参数。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26985650/
我正在尝试使用 parser = argparse.ArgumentParser对于我写的一个小程序。 程序接受作为输入 EITHER ( txt 文件的路径 ) OR ( opt1 && opt2
我为需要遵循特定格式的参数定义了自定义正则表达式类型。我使用了另一篇文章 ( regex custom type ) 中的代码,它非常有用。我的问题是我正在编写单元测试,我希望正则表达式失败并尝试断言
我写了下面的代码。 import argparse parser = argparse.ArgumentParser() parser.add_argument('-v', '--version',
我一定遗漏了一些明显的东西。目标是使用 argparse,第一个参数是必需的,第二个是可选的,其他任何剩余参数都是可选的。 为了展示这个问题,我制作了两个测试解析器;它们之间的唯一区别是在一个中使用
我正在努力寻找一种将参数传递给 docker container 中的 python 脚本的方法。基于ubuntu 。我正在与docker-compose.yml合作. 请查看下面的示例! docke
我正在努力寻找一种将参数传递给 docker container 中的 python 脚本的方法。基于ubuntu 。我正在与docker-compose.yml合作. 请查看下面的示例! docke
我像这样创建一个 argparser: parser = argparse.ArgumentParser(description='someDesc') parser.add_argument
我正在编写一个脚本,其中包含 2 个相互排斥的参数,以及一个仅对其中一个参数有意义的选项。如果您使用毫无意义的参数调用它,我会尝试将 argparse 设置为失败。 要清楚: -m -f 有意义 -s
我正在使用 Python 3.6 和 argparse 1.1。 除了 -h/--help 我还想有一个选项 -v/--version打印带有版本信息的字符串并退出程序(就像使用帮助字符串一样)。但是
有没有办法将来自父解析器的参数分组到不同的组中?我无权访问父解析器本身,所以我不能在那里添加组。 (我使用的是 Google 的 OAuth2 框架)。 目前我的代码是: # test.py from
GNU grep 有一个参数可以在匹配行周围打印一定数量的额外行。从手册页: -C NUM, -NUM, --context=NUM Print NUM lines of output context
现在,我有一个脚本可以使用 argparse 接受命令行参数。例如,像这样: #foo.py def function_with_args(optional_args=None): parser
我在脚本中的 argparse 解析器中添加了一些参数,如下所示: parser = argparse.ArgumentParser() parser.add_argument("--eval_mod
我在 python 代码中使用 argparse 作为参数解析器。将字典解析为 argparse 对象的最佳方法是什么? 例如,我的字典是: { "activation_dropout": 0
我正在使用 argparse从命令行接收输入以运行我的脚本。 我当前的输入字符串如下所示: path> python -t T1 T2 T3 -f F1 F2 argparse 中是否有一个参数,而
我看到了有关使用 argparse 库将字典和列表传递给 Python 的问题。这些示例都显示了我的 Python 代码的样子。但是没有人告诉我它们在命令行上的样子。我在哪里需要大括号、方括号和引号?
我想模拟大多数命令行实用程序的行为,其中可选参数可以放在命令行中的任何位置,包括位置参数之间,例如 mkdir例子: mkdir before --mode 077 after 在这种情况下,我们知道
我想获取传递给 sys.argv 的所有参数有格式someprogram.py --someparameter 23 -p 42 -anotherparam somevalue . 结果我正在寻找一个
这个问题在这里已经有了答案: Argparse optional positional arguments? (3 个回答) 1年前关闭。 我如何才能设置我的 argparser 以具有以下行为? b
这是我的简单 test.py 脚本: import argparse parser = argparse.ArgumentParser('A long string that goes on and
我是一名优秀的程序员,十分优秀!