下面是我整理的一个简单的方法,可能是一个合理的起点:import argparse
class PositionalAction(argparse.Action):
def __call__(self,parser,namespace,values,option_string=None):
lst = getattr(namespace,self.dest)
lst.append(values)
parser.last_positional_values = lst
all_positional = getattr(namespace,'all_positional',[])
all_positional.append(lst)
namespace.all_positional = all_positional
class AssociateAction(argparse.Action):
def __call__(self,parser,namespace,values,option_string=None):
try:
parser.last_positional_values.append(values)
except AttributeError:
pass
parser = argparse.ArgumentParser()
parser.add_argument('-o',action=AssociateAction,dest=argparse.SUPPRESS)
junk,unknown = parser.parse_known_args()
for i,_ in enumerate(unknown):
parser.add_argument('arg%d'%i,action=PositionalAction,default=[])
print parser.parse_args()
在这里,它正在发挥作用:
^{pr2}$
这个问题有一些挑战。首先,要接受argparse不喜欢的任意数量的位置参数。argparse想预先知道会发生什么。解决方案是构建一个解析器并解析命令行,但是告诉argparse只解析已知的参数(在本例中,非位置的-o参数都是静默解析的,但是“位置”参数不会被解析)。parse_known_args非常适合这一点,因为它以(namespace_of_parsed_stuff, uknown_args)的形式返回一个元组。现在我们知道了未知参数,我们只需要为每个参数添加一个位置参数,以使parse_args满意。在
现在,自定义操作实际上在做什么?当找到一个位置参数(在第二个过程中),我们得到默认值(这是一个列表),并将值添加到该列表中(以后我将称之为“值”列表)。然后,我们使用对“value”列表的引用修改解析器。我们还从名称空间中获得“所有位置”列表。如果它没有这个属性,我们只得到一个空列表。我们将“值”列表添加到“所有位置”列表中,并将其放回名称空间。在
现在,当我们碰到一个-o标志时,我们查看解析器以获得“value”列表,并将附加值添加到该列表中。我们可以在不接触解析器的情况下做同样的事情。。。(我们可以看一下namespace.all_positional[-1]它与parser.last_positional_values相同)。在
如果觉得《python可选参数位置_每个位置参数的可选参数》对你有帮助,请点赞、收藏,并留下你的观点哦!