带有子命令的argparse,以及具有可选参数的函数

问题描述 投票:0回答:1

我有这个代码:

import argparse

p = 5

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

def mul(a, b):

    return a * b

def div(a, b):
    return a / b

global_parser = argparse.ArgumentParser(prog="calc")
subparsers = global_parser.add_subparsers(
    title="subcommands", help="arithmetic operations"
)

arg_template = {
    "dest": "operands",
    "type": float,
    "nargs": 2,
    "metavar": "OPERAND",
    "help": "a numeric value",
}

add_parser = subparsers.add_parser("add", help="add two numbers a and b")
add_parser.add_argument(**arg_template)
add_parser.set_defaults(func=add)

sub_parser = subparsers.add_parser("sub", help="subtract two numbers a and b")
sub_parser.add_argument(**arg_template)
sub_parser.set_defaults(func=sub)

mul_parser = subparsers.add_parser("mul", help="multiply two numbers a and b")
mul_parser.add_argument(**arg_template)
mul_parser.set_defaults(func=mul)

div_parser = subparsers.add_parser("div", help="divide two numbers a and b")
div_parser.add_argument(**arg_template)
div_parser.set_defaults(func=div)

args = global_parser.parse_args()

print(args.func(*args.operands))

如果我想将

mul
功能更改为:

def mul(a, b, c = False):
    if c:
        return a * b * p
    else:
        return a * b

如何使用 argparse 处理可选的

c
参数?我的意思是,如果我愿意的话,我想在命令行中将
c
作为
True
传递,否则它仍然是
False

我找不到具体如何解决这个问题,有资源吗?

python argparse
1个回答
0
投票

这应该有效:

import argparse

p = 5

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

def mul(a, b, c = False):
    if c:
        return a * b * p
    else:
        return a * b

def div(a, b):
    return a / b

global_parser = argparse.ArgumentParser(prog="calc")
subparsers = global_parser.add_subparsers(
    title="subcommands", help="arithmetic operations"
)

arg_template = {
    "dest": "operands",
    "type": float,
    "nargs": 2,
    "metavar": "OPERAND",
    "help": "a numeric value",
}

add_parser = subparsers.add_parser("add", help="add two numbers a and b")
add_parser.add_argument(**arg_template)
add_parser.set_defaults(func=add)

sub_parser = subparsers.add_parser("sub", help="subtract two numbers a and b")
sub_parser.add_argument(**arg_template)
sub_parser.set_defaults(func=sub)

mul_parser = subparsers.add_parser("mul", help="multiply two numbers a and b")
mul_parser.add_argument(**arg_template)
mul_parser.add_argument(
    "--flag",
    dest="c",
    action='store_const',
    const=True,
    required=False,
    default=False,
    metavar="FLAG",
    help="an integer value 0 or 1"
)
mul_parser.set_defaults(func=mul)

div_parser = subparsers.add_parser("div", help="divide two numbers a and b")
div_parser.add_argument(**arg_template)
div_parser.set_defaults(func=div)

args = global_parser.parse_args()

args_dict = vars(args)
kwargs = {k:args_dict[k] for k in args_dict.keys() if not k in ["func", "operands"]}

print(args.func(*args.operands, **kwargs))

示例:

python3 test.py add 5 2
>> 7.0
python3 test.py mul 5 2
>> 10.0
python3 test.py mul 5 2 --flag
>> 50.0
© www.soinside.com 2019 - 2024. All rights reserved.