【问题标题】:Python - Argparse: Default agrument that can be overriddenPython - Argparse:可以覆盖的默认参数
【发布时间】:2018-03-26 03:59:46
【问题描述】:

让我们有一个以数字作为输入的程序。尽管如此,可以指定基数。未指定时,数字为十进制。

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

【问题讨论】:

  • 如果你把基础放在条件中会怎样。 if base: 并创建一个默认模板
  • 您的意思是base 是位置性的,而octalbinary 是可选的?
  • 没有基数可以是可选的。但是您可以编写一个条件来检查是否通过了 base。如果没有通过启动基地。发布您的代码,我会看看是否可以添加您需要的内容
  • 这是模型问题,所以代码不多。但我会写

标签: python python-3.x parameter-passing argparse


【解决方案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))

输出;

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

【讨论】:

    【解决方案2】:

    argparse 中使用destaction='store_const'const 选项到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")
    

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 2016-08-14
      • 2018-02-20
      • 2017-10-13
      • 2021-10-16
      • 2023-01-11
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多