【发布时间】:2015-07-25 23:01:40
【问题描述】:
我正在尝试在图像之间进行数学运算。我已经定义(我的真实代码的简化版本):
parser = argparse.ArgumentParser(description='Arithmetic operations on images')
parser.add_argument("input1", metavar='input1', action='store',
help='list of input images to operate with', nargs="+", type=str)
parser.add_argument("operation", metavar='operation', action='store', type=str,
help='type of operation (+,-,*,/) to be done', nargs=1)
parser.add_argument("input2",metavar='input2', action='store', nargs="+",
type=str, help='image (or value) with which to perform the operation on input1')
这段代码,产生:
arith.py -h
usage: arith.py [-h] input1 [input1 ...] operation input2 [input2 ...]
所以它确实理解 input1 可以包含一个或多个元素,操作将是单个元素,而 input2 可以是任意数量的元素。
当然,问题在于有两个位置参数和不确定数量的元素,argparse 混淆了什么是什么。我尝试在“操作”中添加选择=[“+”、“-”、“*”、“/”],以便它知道在哪里进行分离,但似乎 argparse 无法做到这一点。实际上,在 argparse 文档中,谈论 nargs='*' 您可以阅读:
请注意,使用 nargs='*' 拥有多个位置参数通常没有多大意义
我认为我可以将 args.input1、args.operation 和 args.input2 加在一起,然后将自己分开寻找“+”、“-”、“/”、“*”,但在做如此丑陋的事情之前,我想到了挖掘集体思想。
【问题讨论】:
-
我不确定
argparse是否适合您在这里所做的工作。直接通过sys.argv可能会更容易。 -
嗨,凯尔伍德。实际上,我使用 argparse 解析 sys.argv。这为我“免费”提供了用户帮助,它为我完成了所有检查类型和现有变量。直接执行 sys.argv 就像我将 input1、operation 和 input2 汇集在一起,然后将自己分开的解决方案。可行,但丑陋;)。还是谢谢!
-
argparse可以构造这样的帮助消息,但这并不意味着它实际上可以按照您想要的方式解析参数。如果我打电话给arith.py a b c d e f g,哪个是operation?它可以是b到f中的任何一个。argparse没有内置任何类型的回溯模式匹配器;它只是以贪婪的方式从左到右处理参数。 -
可能有更清晰的方法来构建论点。
input1和input2是如何处理的?input1的kth 元素是否使用指定的运算符与input2的kth 元素配对?或者您是否计算两个列表的笛卡尔积并将运算符应用于产品的每个元素?还是别的什么? -
如果 len(input1) = len(input2) 他们配对。如果 len(input2) = 1,则对 input1 的所有元素以及 input2 的单个元素进行操作。