是否有使用argparse的规则?

时间:2016-04-28 02:08:03

标签: python argparse

使用argparse时,如何确定某些内容应该是位置参数,可选参数还是子命令?

1 个答案:

答案 0 :(得分:3)

位置参数通常是必需。例如,如果您的程序总是需要传递一个文件来读取,那么该文件将是位置参数。

可选参数,毫不奇怪,可选。这可能是一个可以具有合理默认值的参数(即您的程序默认在端口8080上运行但可以接受其他端口)或者它可能是打开可选行为的标志(即verbose标志)。

当您想要将一整套不同的命令添加到单个脚本时,通常会使用 subparser 。也许您的脚本可以读取或写入文件,readwrite操作期望各种标记不重叠。在这种情况下,为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