代码之家  ›  专栏  ›  技术社区  ›  Ray Salemi

无法识别argparse子parser

  •  0
  • Ray Salemi  · 技术社区  · 6 年前

    import argparse
    myparser = argparse.ArgumentParser(prog='test')
    myparser.add_argument('mode', choices=['A', 'B'])
    subparsers = myparser.add_subparsers()
    a_parser = subparsers.add_parser('A')
    b_parser = subparsers.add_parser('B')
    a_parser.add_argument('frog',action='store')
    b_parser.add_argument('toad',action='store')
    print(myparser)
    try:
        args = myparser.parse_args(['A', 'frogname'])
        print(args)
    except ArgumentError as ae:
        print(ae)
    

    ArgumentParser(prog='test', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
    usage: test [-h] {A,B} {A,B} ...
    test: error: invalid choice: 'frogname' (choose from 'A', 'B')
    

    我不知道为什么我得到了“mode”参数的多个副本,或者为什么我的子parser被忽略。

    1 回复  |  直到 6 年前
        1
  •  2
  •   user2201041 user2201041    6 年前

    mode add_parser() 这对你有好处。

    myparser = argparse.ArgumentParser(prog='test')
    # myparser.add_argument('mode', choices=['A', 'B'])  # Don't think you need this
    subparsers = myparser.add_subparsers()
    a_parser = subparsers.add_parser('A')
    b_parser = subparsers.add_parser('B')
    a_parser.add_argument('frog',action='store')
    b_parser.add_argument('toad',action='store')
    
    args = myparser.parse_args(['A', 'frogname'])
    print(args)
    >>> Namespace(frog='frogname')
    

    如果mode是除了选择子parser之外还需要设置的单独参数,则需要单独传递该参数

    myparser = argparse.ArgumentParser(prog='test')
    myparser.add_argument('mode', choices=['A', 'B'])
    subparsers = myparser.add_subparsers()
    a_parser = subparsers.add_parser('A')
    b_parser = subparsers.add_parser('B')
    a_parser.add_argument('frog',action='store')
    b_parser.add_argument('toad',action='store')
    
    args = myparser.parse_args(['A', 'A', 'frogname'])
    print(args)
    >>> Namespace(frog='frogname', mode='A')