使用 argparse 有规则吗?

Are there rules to using argparse?

当使用 argparse 时,我如何决定某个东西应该是位置参数、可选参数还是子命令?

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

可选 参数毫无疑问是 可选。这可能是一个参数,可以有一个合理的默认值(即你的程序默认为端口 8080 上的 运行 但可以接受其他端口)或者它可能是一个标志来打开可选行为(即 verbose旗帜)。

A subparser 通常在您想要将一整套不同的命令添加到单个脚本时使用。也许您的脚本可以读取或写入文件,并且 readwrite 操作需要各种不重叠的标志。在这种情况下,有一个用于 read 操作的子解析器和一个用于 write 操作的子解析器来简化这些标志的解析是有意义的。

大多数简单程序都希望坚持使用位置参数和可选参数:您通常会知道何时真正需要使用子解析器。

这是一个(非常人为的)示例程序,它使用了所有三个:

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