我有几个功能的脚本:
def a():
pass
def b():
pass
def c():
pass
其设计将根据命令行参数来调用。我可以创建几个,如果将评估哪些函数语句应该运行:
if args.function == "a":
a()
elif args.function == "b":
b()
elif args.function == "c":
c()
但是,有没有更好的方式来做到这一点?
你可以做像这样一本字典
d = {"a" : a,
"b" : b}
然后派遣
d[args.function]()
也许你正在寻找像click
图书馆吗?它可以让你轻松地添加命令行子与装饰。
import click
@click.group()
def cli():
pass
@cli.command()
def a():
print("I am a")
@cli.command()
def b():
print("Je suis b")
if __name__ == '__main__':
cli()
输出示例:
bash$ ./ick.py --help
Usage: ick.py [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
a
b
bash$ ./ick.py a
I am a
尝试使用eval
eval(function_name_passed_as_argument + "()")
def a():
pass
def b():
pass
eval(args.function + "()")
这并不需要使用if-else
逻辑。作为参数传递函数的名字将被直接执行。
你让一个字典作为已经指出的那样,但是你打算怎么处理不好的输入?我想创建一个默认的方法和使用方法dict.get
:
def fallback():
print('That command does not exist')
# add any code you want to be run for
# a bad input here...
functions = {
'a': a,
'b': b
}
然后,通过检索它调用的函数:
functions.get(args.function.lower(), fallback)()
Python有,我们可以利用例如Argparse,这种方法在Python的命令行可编程应用相当普遍几个内置的功能。基础:
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
通过这种方法,你可以有这样的事情:
$ python3 prog.py -v
verbosity turned on
$ python3 prog.py --help
usage: prog.py [-h] [-v]
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity