用法:
ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_string][, dest][, required][, help][, metavar])
許多程序將其函數拆分為多個sub-commands,例如,
svn
程序可以像svn checkout
、svn update
和svn commit
一樣調用 sub-commands。當程序執行需要不同類型命令行 參數的多個不同函數時,以這種方式拆分函數可能是一個特別好的主意。ArgumentParser
支持使用add_subparsers()
方法創建此類 sub-commands。add_subparsers()
方法通常不帶參數調用,並返回一個特殊的操作對象。該對象有一個方法add_parser()
,它接受一個命令名稱和任何ArgumentParser
構造函數參數,並返回一個可以照常修改的ArgumentParser
對象。參數說明:
- title - 幫助輸出中sub-parser 組的標題;默認情況下 “subcommands” 如果提供了說明,否則使用標題作為位置參數
- description - 幫助輸出中sub-parser 組的說明,默認為
None
- prog - 將與sub-command 幫助一起顯示的使用信息,默認情況下是程序的名稱和子解析器參數之前的任何位置參數
- parser_class - 用於創建 sub-parser 實例的類,默認為當前解析器的類(例如 ArgumentParser)
- action - 在命令行遇到此參數時要采取的基本操作類型
- dest - 將存儲 sub-command 名稱的屬性名稱;默認情況下
None
並且不存儲任何值 - required - 默認情況下是否必須提供子命令
False
(在 3.7 中添加) - help - 幫助輸出中sub-parser 組的幫助,默認為
None
- metavar - 在幫助中顯示可用的字符串 sub-commands;默認情況下它是
None
並以 {cmd1, cmd2, ..} 的形式呈現 sub-commands
一些示例用法:
>>> # create the top-level parser >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--foo', action='store_true', help='foo help') >>> subparsers = parser.add_subparsers(help='sub-command help') >>> >>> # create the parser for the "a" command >>> parser_a = subparsers.add_parser('a', help='a help') >>> parser_a.add_argument('bar', type=int, help='bar help') >>> >>> # create the parser for the "b" command >>> parser_b = subparsers.add_parser('b', help='b help') >>> parser_b.add_argument('--baz', choices='XYZ', help='baz help') >>> >>> # parse some argument lists >>> parser.parse_args(['a', '12']) Namespace(bar=12, foo=False) >>> parser.parse_args(['--foo', 'b', '--baz', 'Z']) Namespace(baz='Z', foo=True)
請注意,
parse_args()
返回的對象將僅包含由命令行選擇的主解析器和子解析器的屬性(而不包含任何其他子解析器)。所以在上麵的例子中,當指定a
命令時,隻存在foo
和bar
屬性,而當指定b
命令時,隻存在foo
和baz
屬性.類似地,當從子解析器請求幫助消息時,隻會打印該特定解析器的幫助。幫助消息將不包括父解析器或兄弟解析器消息。 (但是,可以通過向
add_parser()
提供help=
參數來提供每個子解析器命令的幫助消息,如上所述。)>>> parser.parse_args(['--help']) usage: PROG [-h] [--foo] {a,b} ... positional arguments: {a,b} sub-command help a a help b b help options: -h, --help show this help message and exit --foo foo help >>> parser.parse_args(['a', '--help']) usage: PROG a [-h] bar positional arguments: bar bar help options: -h, --help show this help message and exit >>> parser.parse_args(['b', '--help']) usage: PROG b [-h] [--baz {X,Y,Z}] options: -h, --help show this help message and exit --baz {X,Y,Z} baz help
add_subparsers()
方法還支持title
和description
關鍵字參數。當其中任何一個存在時,子解析器的命令將出現在幫助輸出中它們自己的組中。例如:>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers(title='subcommands', ... description='valid subcommands', ... help='additional help') >>> subparsers.add_parser('foo') >>> subparsers.add_parser('bar') >>> parser.parse_args(['-h']) usage: [-h] {foo,bar} ... options: -h, --help show this help message and exit subcommands: valid subcommands {foo,bar} additional help
此外,
add_parser
支持額外的aliases
參數,它允許多個字符串引用同一個子解析器。此示例與svn
類似,將co
別名為checkout
的簡寫:>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers() >>> checkout = subparsers.add_parser('checkout', aliases=['co']) >>> checkout.add_argument('foo') >>> parser.parse_args(['co', 'bar']) Namespace(foo='bar')
處理sub-commands 的一種特別有效的方法是將
add_subparsers()
方法的使用與對set_defaults()
的調用結合起來,以便每個子解析器知道它應該執行哪個Python 函數。例如:>>> # sub-command functions >>> def foo(args): ... print(args.x * args.y) ... >>> def bar(args): ... print('((%s))' % args.z) ... >>> # create the top-level parser >>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers() >>> >>> # create the parser for the "foo" command >>> parser_foo = subparsers.add_parser('foo') >>> parser_foo.add_argument('-x', type=int, default=1) >>> parser_foo.add_argument('y', type=float) >>> parser_foo.set_defaults(func=foo) >>> >>> # create the parser for the "bar" command >>> parser_bar = subparsers.add_parser('bar') >>> parser_bar.add_argument('z') >>> parser_bar.set_defaults(func=bar) >>> >>> # parse the args and call whatever function was selected >>> args = parser.parse_args('foo 1 -x 2'.split()) >>> args.func(args) 2.0 >>> >>> # parse the args and call whatever function was selected >>> args = parser.parse_args('bar XYZYX'.split()) >>> args.func(args) ((XYZYX))
這樣,您可以讓
parse_args()
在參數解析完成後調用相應的函數。將函數與此類操作相關聯通常是為每個子解析器處理不同操作的最簡單方法。但是,如果需要檢查被調用的子解析器的名稱,add_subparsers()
調用的dest
關鍵字參數將起作用:>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers(dest='subparser_name') >>> subparser1 = subparsers.add_parser('1') >>> subparser1.add_argument('-x') >>> subparser2 = subparsers.add_parser('2') >>> subparser2.add_argument('y') >>> parser.parse_args(['2', 'frobble']) Namespace(subparser_name='2', y='frobble')
在 3.7 版中更改:新的
required
關鍵字參數。
相關用法
- Python argparse.ArgumentParser.add_argument_group用法及代碼示例
- Python argparse.ArgumentParser.add_mutually_exclusive_group用法及代碼示例
- Python argparse.ArgumentParser.convert_arg_line_to_args用法及代碼示例
- Python argparse.ArgumentParser.get_default用法及代碼示例
- Python argparse.ArgumentParser.exit用法及代碼示例
- Python argparse.ArgumentParser.set_defaults用法及代碼示例
- Python argparse.FileType用法及代碼示例
- Python ast.MatchClass用法及代碼示例
- Python abc.ABCMeta用法及代碼示例
- Python ast.ListComp用法及代碼示例
- Python ast.Lambda用法及代碼示例
- Python asyncio.BaseTransport.get_extra_info用法及代碼示例
- Python ast.IfExp用法及代碼示例
- Python unittest assertNotIsInstance()用法及代碼示例
- Python ast.Return用法及代碼示例
- Python Tkinter askopenfile()用法及代碼示例
- Python ast.Subscript用法及代碼示例
- Python asyncio.shield用法及代碼示例
- Python asyncio.run用法及代碼示例
- Python unittest assertIsNotNone()用法及代碼示例
注:本文由純淨天空篩選整理自python.org大神的英文原創作品 argparse.ArgumentParser.add_subparsers。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。