2017-10-14 10 views
2

数値を入力として扱うプログラムを作ってみましょう。それにもかかわらず、ベースを指定することができます。指定しない場合、数値は10進数で表されます。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を使用するオプションがあることを知っていますが、これはうまくいきません。なぜなら、常にベースを指定する必要があるからです。

モデルコード:

#!/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)) 

出力;​​にadd_argumentdestaction='store_const'constオプションを使用して

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

、あなたがこれを行うことができます:

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

を以下の結果を得:

$ 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 

をまたかもしれませんの使用を検討する代わりにオプションを整数値(デフォルトは10)で指定します。私にとっては、あなたのプログラムはより明確でシンプルになります:

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