为什么有多个解析器?

Why have multiple parsers?

我正在阅读 argparse 文档:https://docs.python.org/3.4/library/argparse.html

我通读了 ArgumentParser 的 "parents" 文档,它提到当多个解析器共享公共参数时使用它。我想知道,我什么时候首先需要 "several parsers" ?

documentation 已经相当简单了:

Rather than repeating the definitions of these arguments, a single parser with all the shared arguments and passed to parents= argument to ArgumentParser can be used

我想到的一个 用例 是当您有很多脚本对需要访问用户名和密码的数据库执行不同操作时。其中一个脚本更改了 table,另一个更改了一些权限...但是所有这些脚本都需要用户名和密码才能访问数据库,对吗?

您可以有一个 "base" 参数解析器,它需要(或解析)用户名和密码,然后有更多参数的更专业的解析器。例如:

import argparse


def make_basic_parser():
    parser = argparse.ArgumentParser(description='Basic parser (only username/password).',
                                     add_help=False)
    parser.add_argument('--username', type=str, help='Username to access database')
    parser.add_argument('--password', type=str, help='Password to access database')
    return parser


def alter_table_parser():
    parent = make_basic_parser()
    parser = argparse.ArgumentParser(description='Alter a table', parents=[parent])
    parser.add_argument('--table', type=str, help='Table to alter')
    return parser


if __name__ == "__main__":
    parser = alter_table_parser()
    args = parser.parse_args()
    print("Received arguments: %s" % (args))

运行 这将导致:

$ python ./stack_055_A.py --username foo --password bar --table baz
Received arguments: Namespace(password='bar', table='baz', username='foo')

因此,您可以在每次需要用户名和密码时重复使用 basic\parser