2013-01-01 56 views
1

這裏是一個簡單的例子。設置默認值與argparse和相同的目標屬性

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())) 

結果:

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

沒有set_defaults線,結果是:

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

怎麼可能爲這樣的結果配置argparse?

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

回答

0

正如其他人所說,store_const幾乎做你想要的,除了(如@ Theodros Zelleke點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默認可能性的解決方案。 – MB4E

0

你應該存儲cost,而不是附加的,使用action'store_const'doc):

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'])