는 여기에 내가 시작하는 적절한 장소가 될 수있는 것을 함께 넣어 간단한 해킹 :
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()
그리고 여기 행동에 :
temp $ python test1.py foo -o 1 bar -o 2 baz qux -o 4
Namespace(all_positional=[['foo', '1'], ['bar', '2'], ['baz'], ['qux', '4']], arg0=['foo', '1'], arg1=['bar', '2'], arg2=['baz'], arg3=['qux', '4'])
이 문제는 몇 가지 문제가 있습니다. 첫째, 임의의 수의 위치 인수를 받아들이려고합니다. argparse는 그것을 좋아하지 않습니다. argparse는 무엇을 기대해야하는지 알기를 원합니다. 해결 방법은 구문 분석기를 작성하고 명령 줄을 구문 분석하는 것이지만 알려진 인수 만 구문 분석하도록 알리는 것입니다 (이 경우 위치가 아닌 -o
인수는 모두 자동으로 구문 분석되지만 "위치"인수는 구문 분석되지 않습니다). . parse_known_args
은 (namespace_of_parsed_stuff, uknown_args)
형식의 튜플을 반환하므로 완벽합니다. 이제 우리는 알려지지 않은 인수를 알았습니다. parse_args를 행복하게 만들기 위해 각 구문 분석기에 위치 인수를 추가하기 만하면됩니다.
이제 실제로 수행하는 사용자 지정 동작은 무엇입니까? 두 번째 단계에서 위치 인수가 발견되면 기본값 (목록)을 가져 와서 그 목록에 값을 추가합니다 (이후에서는이를 "값"목록이라고합니다). 그런 다음 파서을 "값"목록에 대한 참조로 수정합니다. 또한 네임 스페이스에서 "all_positional"목록을 얻습니다. 그 속성이 없다면 빈리스트 만 얻는다. "value"목록을 "all_positional"목록에 추가하고 이름 공간에 다시 넣습니다.
이제 -o
플래그를 누르면 "값"목록을 가져 오기 위해 파서가 표시되고 추가 값이 목록에 추가됩니다. 파서를 전혀 건드리지 않고 똑같은 일을 할 수 있습니다 ... (우리는 namespace.all_positional[-1]
을 볼 수 있습니다 - parser.last_positional_values
과 같은 목록입니다).
얼마나 많은 위치 인수가 있습니까? – mgilson
아니요. 몇 개에 관계없이 인수를 반복하고 싶습니다. – bkanuka