我有这个代码:
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
。
我找不到具体如何解决这个问题,有资源吗?
这应该有效:
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