2012-06-30 3 views
5

나는 위치 인수를 그것이 존재할 때 존재하는 "인수 상태"와 연관 짓고 싶습니다. 예를 들어, 다음 명령 행 :argparse는 명명 된 인수와 위치 인수를 연관시킬 수 있습니까?

foo: m=1, r=0 (default value for r) 
bar: m=1, r=2 
baz: m=1, r=7 
quux: m=6, r=7 

이이 argparse 모듈을 수행 할 수 있습니다

script.py -m 1 foo -r 2 bar -r 7 baz -m 6 quux 

는 다음과 같은 연결을 생성해야 하는가?

+0

"인수 상태"가 일정합니까? 예 : '('foo', 'bar', 'baz', 'quux'...) 만 사용한다면 앞을 알 수 있습니까? 아니면 사용자가 원하는대로 무엇이든 넣을 수 있습니까? – mgilson

+0

@mgnilson - 원하는 곳이면 어디서든 사용할 수 있습니다. 내가 바라는 것은 파일 이름과 처리 옵션의 목록이다. 'argparse'가 위치 인수를 다루는 것에 기반하여, 저는 모델을 깨뜨리는 커스텀 액션 없이는 이것을 수행 할 수 없다고 생각하고 있습니다. 이것은 현재 내가 놀고있는 것입니다. –

+0

커스텀 액션에 대해서도 생각하고 있었지만, argparse는 모든 위치 인수가 함께 주어진 것으로 가정하기 때문에 까다 롭습니다. 유일한 해결책은'nargs = '*''를 모든 곳에서 사용하고 모든 작업 내에서 올바른 번호를 가지고 있는지 확인하는 것입니다. (그것은 기껏해야 깨지기 쉬운 것처럼 보인다). '-m 1 -f foo -r 2 -f bar -r 7 -f baz -m 6 -f quux' – mgilson

답변

1

이것은 유용하지 않을 수도 있지만, sys.argv을 조각으로 나눌 수 있다면이 문제는 가장 쉬운 것 같습니다. 본질적으로 어느 부분이 "위치 적"인수가되어야하는지 파악할 수 있어야합니다 당신이 말했듯이, 그들은 어디에서나 발생할 수 있습니다.) 그리고 어떤 조각들이 어떤 종류의 논쟁으로 여겨지기 때문에 실제로 위치가 정해지지 않았습니다. 아래의 예제에서는 예제를 사용하도록 설정했지만 파일이나 특정 종류의 파일에 대해서도 마찬가지로 sys.argv을 쉽게 분할 할 수 있습니다. condition 기능은 귀하가 작성해야합니다. 나머지는 (희망을 갖고) 자명하다.

import argparse 
import sys 
import copy 
import os 

def split_list(lst,condition): 
    current=[] 
    out=[current] 
    for arg in lst: 
     current.append(arg) 
     if(condition(arg)): 
      current=[] 
      out.append(current) 

    return out 


parser=argparse.ArgumentParser() 
parser.add_argument('-m',action='store') 
parser.add_argument('-r',default='0',action='store') 
#pieces=split_list(sys.argv[1:],os.path.isfile) 
pieces=split_list(sys.argv[1:],lambda x: x in ('foo','bar','baz','quux')) 
options={} #use collections.OrderedDict if order matters -- or some more suitable data structure. 
default=argparse.Namespace() 
for args in pieces: 
    if(not args): 
     continue 
    ns=copy.deepcopy(default) 
    default=parser.parse_args(args[:-1],namespace=ns) 
    options[args[-1]]=default 

print (options) 
+0

흥미로운 아이디어! 람다를'x [0]! = "-"'로 변경하면 args를 효과적으로 분할해야합니다. (기본 구문은'-'로 시작하는 파일 이름을 받아들이는 것이 부당하다고 생각합니다). 내가 이것으로 놀아 보자. –

+0

@BenBlank는 'x.startswith가 아닌 ('- ')'으로 람다를 변경하는 것은 내 첫 번째 생각이기도하지만'1 '은'- '로 시작하지 않기 때문에 테스트 예제에서 실패합니다. - – mgilson

+0

[대체 (https://gist.github.com/3026853) 하드 코딩 된 로직으로 명명 된 매개 변수 뒤에 분리를 거부합니다. 그 변화로, 이것은 내가 필요로하는 것을 정확하게하고있다! 도와 주셔서 감사합니다. –

관련 문제