python可选参数位置_每个位置参数的可选参数
下面是我整理的一個簡單的方法,可能是一個合理的起點: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可选参数位置_每个位置参数的可选参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卓越性能代码_「Win」被隐藏起来的卓越
- 下一篇: layui根据条件显示列_templet