使用argparse时,如何确定某些内容应该是位置参数,可选参数还是子命令?
答案 0 :(得分:3)
位置参数通常是必需。例如,如果您的程序总是需要传递一个文件来读取,那么该文件将是位置参数。
可选参数,毫不奇怪,可选。这可能是一个可以具有合理默认值的参数(即您的程序默认在端口8080
上运行但可以接受其他端口)或者它可能是打开可选行为的标志(即verbose
标志)。
当您想要将一整套不同的命令添加到单个脚本时,通常会使用 subparser 。也许您的脚本可以读取或写入文件,read
和write
操作期望各种标记不重叠。在这种情况下,为read
操作创建一个subparser,为write
操作创建一个subparser以简化这些标志的解析是有意义的。
大多数简单的程序都希望坚持使用位置和可选参数:您通常知道何时需要使用subparser。
这是一个使用全部三个的(非常人为的)示例程序:
import argparse
def parse_args():
p = argparse.ArgumentParser()
p.add_argument("filename", help="Filename to interact with")
p.add_argument("-v", "--verbose", action="store_true", help="Turn on verbose mode")
subparsers = p.add_subparsers(title="Commands", dest="command")
read_p = subparsers.add_parser("read", help="read from FILENAME")
load_p = subparsers.add_parser("load", help="load from FILENAME")
return p.parse_args()
if __name__ == "__main__":
args = parse_args()
以下是其帮助文本:
usage: foo.py [-h] [-v] filename {read,load} ...
positional arguments:
filename Filename to interact with
optional arguments:
-h, --help show this help message and exit
-v, --verbose Turn on verbose mode
Commands:
{read,load}
read read from FILENAME
load load from FILENAME