python 中的解析参数
parsing argument in python
我有一个问题,我正在寻找解决方案。我不确定我是否可以用 argparse 做到这一点。
我希望能够指定一个选项
myprog -a 1
myprog -a 2
现在当我有 a = 1 时,我希望能够指定 b 和 c。但是当a = 2时,我只能指定d.
myprog -a 1 -b 3 -c 0
myprog -a 2 -d 3
还必须始终指定 a
最简单的解决方案是将 '-a'
设置为 required=True
参数,而将其他参数保留为默认值 not-required。然后在解析后对 args.a
和其他值执行测试(我假设您可以编写那种 Python 逻辑)。
您可以提出自己的错误,也可以使用 parser.error("I don't like your input")
调用。
你们很多人需要编写自定义 usage
行。鉴于这些要求,什么是有意义的用法?
有一个mutually exclusive argument group
方法,但它不使用具体的值,只是参数的存在与否。
您还可以将测试合并到自定义操作中 类。但通常这比解析后执行测试更复杂(因为 argparse 处理以任何顺序出现的参数)。
另一种将 -a
参数转换为子解析器的可能性。这允许您为一个 'parser' 值定义一组参数,为另一个值定义另一组参数。我认为 argparse 文档对此已经足够清楚了。
您不能将切换值作为单个 parse_args
调用来执行此操作,但您可以执行以下操作之一:
- 使用sub-commands/sub-parsers
- 在完全配置解析器和运行之前在完整的命令行上进行部分解析,首先只检查
a
,然后根据结果选择额外的解析器args进行解析第一个电话。诀窍是在第一次调用时使用 parse_known_args
,因此它处理 a
(它识别)并忽略其他所有内容。
例如,对于方法 #2,您可以这样做:
parser = argparse.ArgumentParser()
parser.add_argument('-a', required=True, type=int, choices=(1, 2)
args = parser.parse_known_args()
if args.a == 1:
parser.add_argument('-b', ...)
parser.add_argument('-c', ...)
args = parser.parse_args()
else:
parser.add_argument('-d', ...)
args = parser.parse_args()
这种方法的缺点是因错误使用而吐出的使用信息将不完整;您必须在基本解析器中手动包含指定 "real" 用法的文本,这很不好玩。子解析器无法根据值开关进行切换,但它们具有统一、连贯的用法显示。
我有一个问题,我正在寻找解决方案。我不确定我是否可以用 argparse 做到这一点。
我希望能够指定一个选项
myprog -a 1
myprog -a 2
现在当我有 a = 1 时,我希望能够指定 b 和 c。但是当a = 2时,我只能指定d.
myprog -a 1 -b 3 -c 0
myprog -a 2 -d 3
还必须始终指定 a
最简单的解决方案是将 '-a'
设置为 required=True
参数,而将其他参数保留为默认值 not-required。然后在解析后对 args.a
和其他值执行测试(我假设您可以编写那种 Python 逻辑)。
您可以提出自己的错误,也可以使用 parser.error("I don't like your input")
调用。
你们很多人需要编写自定义 usage
行。鉴于这些要求,什么是有意义的用法?
有一个mutually exclusive argument group
方法,但它不使用具体的值,只是参数的存在与否。
您还可以将测试合并到自定义操作中 类。但通常这比解析后执行测试更复杂(因为 argparse 处理以任何顺序出现的参数)。
另一种将 -a
参数转换为子解析器的可能性。这允许您为一个 'parser' 值定义一组参数,为另一个值定义另一组参数。我认为 argparse 文档对此已经足够清楚了。
您不能将切换值作为单个 parse_args
调用来执行此操作,但您可以执行以下操作之一:
- 使用sub-commands/sub-parsers
- 在完全配置解析器和运行之前在完整的命令行上进行部分解析,首先只检查
a
,然后根据结果选择额外的解析器args进行解析第一个电话。诀窍是在第一次调用时使用parse_known_args
,因此它处理a
(它识别)并忽略其他所有内容。
例如,对于方法 #2,您可以这样做:
parser = argparse.ArgumentParser()
parser.add_argument('-a', required=True, type=int, choices=(1, 2)
args = parser.parse_known_args()
if args.a == 1:
parser.add_argument('-b', ...)
parser.add_argument('-c', ...)
args = parser.parse_args()
else:
parser.add_argument('-d', ...)
args = parser.parse_args()
这种方法的缺点是因错误使用而吐出的使用信息将不完整;您必须在基本解析器中手动包含指定 "real" 用法的文本,这很不好玩。子解析器无法根据值开关进行切换,但它们具有统一、连贯的用法显示。