2017-10-14 146 views
2

讓我們有一個程序,它將一個數字作爲輸入。儘管如此,基地可以指定。未指定時,數字以十進制爲基數。Python - Argparse:可以被忽略的默認填充

# 10 in decimal 
./get_num.py 10 

# 10 in octal 
./get_num.py -o 12 

# 10 in binary 
./get_num.py -b 1010 

我想使用Python Argparse模塊,但無法找到實現此結果的方法。我知道有一個選項可以使用mutually exclusive group,但是這不太合適,因爲那時候需要總是指定base。

型號代碼:

#!/usr/bin/env python3 

from argparse import ArgumentParser 


parser = ArgumentParser() 
parser.add_argument('base') 
parser.add_argument('-o') 
parser.add_argument('-b') 

args = parser.parse_args() 


if args.o: print('octal', args.o) 
if args.b: print('binary', args.b) 
else: print('decimal', args.base) 
+0

如果你把基地置於有條件的情況下。 '如果base:'並創建一個默認模板 – Joe

+0

你的意思是'base'是位置的,'octal'和'binary'是可選的? –

+0

沒有基地是可選的。但是你可以寫一個條件來檢查基地是否通過。如果不通過發起基地。發佈你的代碼,我會看看我是否可以添加你需要的東西 – Joe

回答

1

我覺得這樣做你以後。您不需要在互斥組中指定基數,默認情況下爲required = false。

import argparse 

parser = argparse.ArgumentParser(prog='PROG') 
group = parser.add_mutually_exclusive_group() 
group.add_argument('-b', action='store_true') 
group.add_argument('-o', action='store_true') 
parser.add_argument('num', help='number') 

args=parser.parse_args() 

base=10 # default base 
if args.b: 
    base=2 
elif args.o: 
    base=8 
# add other bases as required 

print(int(args.num, base=base)) 

輸出;結果如下

import argparse 

parser = argparse.ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
parser.add_argument('value', help='Value') 
group.set_defaults(base=10) 
group.add_argument('-b', dest='base', action='store_const', const=2, 
        help="Use base 2") 
group.add_argument('-o', dest='base', action='store_const', const=8, 
        help="Use base 8") 

args = parser.parse_args() 

print("Value {value}, base {base}".format(value=args.value, base=args.base)) 

run get_num.py -b 1010 
10 

run get_num.py -o 12 
10 

run get_num.py 10 
10 

run get_num.py -b -o 12 
usage: PROG [-h] [-b | -o] num 
PROG: error: argument -o: not allowed with argument -b 
An exception has occurred, use %tb to see the full traceback. 

SystemExit: 2 
0

在​​使用destaction='store_const'const選項add_argument,你可以做到這一點

$ python base.py 100 
Value 100, base 10 
$ python base.py 100 -b 
Value 100, base 2 
$ python base.py 100 -b2 
usage: base.py [-h] [-b | -o] value 
base.py: error: argument -b: ignored explicit argument '2' 
$ python base.py 100 -o 
Value 100, base 8 
$ python base.py 100 -o -b 
usage: base.py [-h] [-b | -o] value 
base.py: error: argument -b: not allowed with argument -o 

您可能還考慮使用--base選項,而不是整數值(默認爲10)。對我來說,這使得你的程序更清晰和簡單:

parser = argparse.ArgumentParser() 
parser.add_argument('value', help='Value') 
parser.add_argument('-B', '--base', type=int, default=10, 
        help="Base to use")