2013-01-01 3 views
1

여기에 간단한 예제가 있습니다.argparse와 같은 dest 속성으로 디폴트 값을 설정하시오.

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('-a', action = 'append_const', dest = 'letter', const = 'a') 
parser.add_argument('-b', action = 'append_const', dest = 'letter', const = 'b') 
parser.set_defaults(letter = ['a', 'b']) 
print(parser.parse_args('-a'.split())) 
print(parser.parse_args('-b'.split())) 
print(parser.parse_args(''.split())) 

결과 : set_defaults 라인없이

Namespace(letter=['a', 'b', 'a']) 
Namespace(letter=['a', 'b', 'b']) 
Namespace(letter=['a', 'b']) 

는, 결과는 다음과 같습니다

Namespace(letter=['a']) 
Namespace(letter=['b']) 
Namespace(letter=None) 

어떻게 그런 결과를 argparse를 구성 할 수 있습니다?

Namespace(letter=['a']) 
Namespace(letter=['b']) 
Namespace(letter=['a', 'b']) 

답변

0

을 다른 언급했듯이, store_const거의 당신이 원하는 것을, 제외하고 (@ Teodros Zelleke poin ts out) -ab은 올바르게 구문 분석되지 않습니다. 나는 parse_args가 호출 된 이후에 그 문제를 해결하는 가장 간단한 방법은 단순히 인수의 경우를 처리하기 위해 생각 :

import argparse 
import sys 

def parse_args(argv = sys.argv[1:]): 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-a', action = 'append_const', dest = 'letter', const = 'a') 
    parser.add_argument('-b', action = 'append_const', dest = 'letter', const = 'b') 
    args = parser.parse_args(argv) 
    if args.letter is None: 
     args.letter = ['a','b'] 
    return args 

print(parse_args('-a'.split())) 
print(parse_args('-b'.split())) 
print(parse_args('-ab'.split())) 
print(parse_args(''.split())) 

이것은 내가 사용하는 솔루션입니다

Namespace(letter=['a']) 
Namespace(letter=['b']) 
Namespace(letter=['a', 'b']) 
Namespace(letter=['a', 'b']) 
+0

를 얻을 수 있습니다. 따라서 argparse defaults possiblities를 사용하는 해결책은 없습니다. – MB4E

0

당신은 action'store_const' (doc)를 사용하여, 추가 대신 cost을 저장해야합니다 :

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('-a', action = 'store_const', dest = 'letter', const = 'a') 
parser.add_argument('-b', action = 'store_const', dest = 'letter', const = 'b') 
parser.set_defaults(letter = ['a', 'b']) 
print(parser.parse_args('-a'.split())) 
print(parser.parse_args('-b'.split())) 
print(parser.parse_args(''.split())) 

가 발생합니다 :

Namespace(letter='a') 
Namespace(letter='b') 
Namespace(letter=['a', 'b'])