Python - Argparse:可以覆盖的默认agrument

时间:2017-10-14 00:38:36

标签: python python-3.x parameter-passing 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)

2 个答案:

答案 0 :(得分:1)

我认为这就是你所追求的。您不需要在互斥组中指定基数,默认为required = false。

00000000: 6f45 2301                                oE#.

输出;

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

答案 1 :(得分:0)

使用dest中的action='store_const'constadd_argument选项argparse,您可以执行以下操作:

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

您也可以考虑使用--base选项,使用整数值(默认值为10)。对我而言,这使您的程序更加清晰和简单:

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