Python - Argparse:可以覆盖的默认参数
Python - Argparse: Default agrument that can be overridden
让我们编写一个将数字作为输入的程序。尽管如此,可以指定基数。未指定时,数字以十进制为基数。
# 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)
我认为这可以满足您的需求。互斥组中不需要指定基数,默认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))
输出;
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
使用 dest
、action='store_const'
和 const
选项到 argparse
中的 add_argument
,您可以这样做:
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")
让我们编写一个将数字作为输入的程序。尽管如此,可以指定基数。未指定时,数字以十进制为基数。
# 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)
我认为这可以满足您的需求。互斥组中不需要指定基数,默认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))
输出;
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
使用 dest
、action='store_const'
和 const
选项到 argparse
中的 add_argument
,您可以这样做:
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")