- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想手动处理 parse_args()
在参数值未知时抛出错误的情况。例如:如果我有以下名为 script.py
的 python 文件:
argp = argparse.ArgumentParser(description='example')
argp.add_argument('--compiler', choices=['default', 'clang3.4', 'clang3.5'])
args = argp.parse_args()
然后我使用以下参数运行脚本 python script.py --compiler=foo
它抛出以下错误:
error: argument --compiler: invalid choice: 'foo' (choose from 'default', 'clang3.4', 'clang3.5')
SystemExit: 2
我需要做什么才能自己处理此行为而不是脚本自行退出?一个想法是子类化 argparse.ArgumentParser
并覆盖 parse_args()
或者只是猴子修补方法,但我想知道是否有更好的方法不需要覆盖标准库行为?
最佳答案
定义选择的全部意义在于让解析器提示不在列表中的值。但还有一些替代方案:
省略选择(如果需要,将它们包括在帮助文本中),并在解析后进行自己的测试。 argparse
不必为您做所有事情。它的主要目的是弄清楚您的用户想要什么。
重新定义 parser.error
方法(最好通过子类化)以从 sys.exit
重定向错误。但是您必须解析错误消息以区分此错误和解析器可能引发的其他错误。
定义一个 type
函数来检查选择并进行默认替换。
“--compiler”选项的解析是这样的:
--compiler
标志之后获取字符串参数type
函数传递它。默认为 lambda x:x
。 int
将其转换为整数等。引发 ValueError
是错误的。choices
列表(如果有)检查返回值action
将值添加到命名空间(默认只是存储它)。任何这些步骤中的错误都会产生一个 ArgumentError
,它被 parser.error
方法捕获并传递给 parser.exit
方法.
由于 store_action
发生在 type
和 choices
检查之后,自定义操作不会绕过它们的错误。
这是一个可能的type
解决方案(未测试)
def compile_choices(astr):
if astr in ['default', 'clang3.4', 'clang3.5']:
return astr
else:
return 'default'
# could raise ValueError('bad value') if there are some strings you don't like
argp.add_argument('--compiler', type=compile_choices)
=================
如果 compile_choices
采用其他参数,例如选择列表或默认值,您需要在解析之前包装一些定义这些值的原因。
一个接受二进制字符串表示的例子:
parser.add_argument('--binary', type=lambda x: int(x, base=2),
help='integer in binary format', default='1010')
或
parser.add_argument('--binary', type=functools.partial(int, base=2), default='1010')
关于python - 处理 Python ArgumentParser 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39232167/
我试图有两个选项供用户选择.. parser = argparse.ArgumentParser(description='This is a test script...') parser.add_
我想创建具有以下签名的参数解析器: ./myapp [-a [-b BVAL] | -c] 换句话说,用户可以提供参数-b BVAL 只有在他提供参数-a 的情况下。 创建互斥组 -a 和 -c 很容
argumentparser 可以接受文件类型参数并直接打开文件,例如: parser.add_argument('infile', nargs='?', type=argparse.FileType
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 3年前关闭。 Improve t
找不到任何现有的方法,所以我想知道是否有 hack? 最佳答案 有一个黑客;您可以使用未记录的属性 parser._actions 列出所有已注册的操作: >>> import argparse >>
有没有办法为 np.array 而不是列表添加参数到 ArgumentParser ?我知道我可以做这样的事情 import argparse parser = argparse.ArgumentPa
我正在尝试添加开关 -c 并指定配置文件。我现在使用 config.dat 让它工作,但是当我使用 -c 并指定一个新的 .dat 时,它使用默认的 config.dat.... 知道我哪里出错了吗?
我认为下面的代码是正确的。它试图使命令行中的“checkRoot”选项成为可能。但即使是最简单的代码也行不通,用 'ArgumentParser' object has no attribute 'p
我正在尝试做一件非常简单的事情 - 只有两个选项:-p 和 -c,它们互斥并且可能有也可能没有 argument,使用可选参数执行 th...is 或不使用参数执行 th...at。这是我得到的: d
我想给切片字符串作为参数,见下文 import argparse def _parse_slice(s): a = [int(e) if e.strip() else None for e i
问题:从现有 argparse.ArgumentParser 对象访问可能参数的预期/官方方式是什么? 示例:让我们假设以下上下文: import argparse parser = argparse
我正在对 ArgumentParser 进行子类化,以便我可以干掉我在包中的多个命令中的通用代码。但是,我遇到了一些我无法解释的奇怪行为。 查看我的程序的这个非常简化的版本,并注意末尾带有注释的两行:
我想翻译如下内容: test.py --group 1 --opt1 foo1 --opt2 bar1 \ --group 2 --opt1 foo2 \ --grou
我正在开发自动化测试框架(使用 pytest)来测试应用程序的多种风格。测试框架应该能够解析通用(所有风格)命令行参数和特定于风格的参数。代码如下所示: 父级.py: import argparse
我想手动处理 parse_args() 在参数值未知时抛出错误的情况。例如:如果我有以下名为 script.py 的 python 文件: argp = argparse.ArgumentParser
conflict_handler(action, confl_optionals) File "/usr/local/lib/python3.6/argparse.py", line 1510,
我正在使用 argparse接受命令行输入并生成帮助文本。我想使用 ArgumentDefaultsHelpFormatter 作为 formatter_class,但是这会阻止我也使用 RawDes
我将如何在 choices 中包含正则表达式? Python 的 ArgumentParser.add_argument() 方法的 kwarg? 例如,假设我想创建自己的自定义挂载程序: # fil
我的脚本包含一长串可选参数,最近我在其中添加了通过文件传递参数的选项。其代码如下:我首先添加 from_file 参数,然后添加 parse_known_args。除了 -h 标志之外,一切正常。调用
例如: import argparse parser = arparse.ArgumentParser() # parser.add_argument(...) ... args = parser.p
我是一名优秀的程序员,十分优秀!