代码之家  ›  专栏  ›  技术社区  ›  wim

Subparser argparse“错误:参数太少”

  •  1
  • wim  · 技术社区  · 6 年前
    # bird.py
    from argparse import ArgumentParser, SUPPRESS
    
    parser = ArgumentParser(argument_default=SUPPRESS)
    parser.add_argument('--dead', action='store_true')
    subparsers = parser.add_subparsers()
    subparser = subparsers.add_parser('parrot', parents=[parser], add_help=False)
    subparser.add_argument('--volts', type=int)
    args = parser.parse_args()
    print(args)
    

    bird.py

    $ python3 bird.py parrot --volts 4000000
    Namespace(volts=4000000)
    $ python2 bird.py parrot --volts 4000000
    usage: bird.py parrot [-h] [--dead] [--volts VOLTS] {parrot} ...
    bird.py parrot: error: too few arguments
    

    据我所知,代码中没有任何只使用py3的特性。为什么不一样呢?如何更新此代码,以便CLI也支持Python 2.7, 不以任何方式修改其python3行为 ?

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

    parents 复制的比你想要的多。 父母 试图模仿父母的替罪羊,结果却试图 subparser parrot 没有自己的 鹦鹉 不是一个错误。在Python2上,需要子parser,所以 鹦鹉 鹦鹉 抱怨没有得到(考虑到您在尝试将父解析器用作父解析器时添加了一个子解析器来修改父解析器,因此,如果比这更多的解析器被损坏,我也不会感到意外。)

    而不是试图使用 parser 作为其自身子parser的父级,而是创建一个单独的父级解析器,并将其用作顶级解析器和parrot子parser的父级:

    from argparse import ArgumentParser
    
    shared = ArgumentParser(add_help=False)
    shared.add_argument('--dead', action='store_true')
    
    parser = ArgumentParser(parents=[shared])
    subparsers = parser.add_subparsers()
    subparser = subparsers.add_parser('parrot', parents=[shared])
    subparser.add_argument('--volts', type=int)
    args = parser.parse_args()
    print(args)
    

    结果:

    $ python2 bird.py parrot --volts 4000000
    Namespace(dead=False, volts=4000000)
    $ python3.6 bird.py parrot --volts 4000000
    Namespace(dead=False, volts=4000000)
    

    但是,还有更多的问题,因为您正在添加 --dead

    $ python bird.py --dead parrot
    Namespace(dead=False, volts=None)
    $ python bird.py parrot --dead
    Namespace(dead=True, volts=None)
    

    给顶级解析器和子解析器一个 --死的 如果它们有不同的 dest store_true 目的地 父母 机制。

        2
  •  0
  •   Antwane    6 年前

    parents 中的参数 subparsers.add_parser() 打电话。

    # bird.py
    from argparse import ArgumentParser
    parser = ArgumentParser()
    parser.add_argument('--dead', action='store_true')
    subparsers = parser.add_subparsers()
    subparser = subparsers.add_parser('parrot', add_help=False)
    subparser.add_argument('--volts', type=int)
    args = parser.parse_args()
    print(args)
    

    然后

    $ python scratch.py parrot --volts 1000
    Namespace(dead=False, volts=1000)
    

    subparsers.add\u parser() ArgumentParser

    class ArgumentParser(_AttributeHolder, _ActionsContainer):
        """Object for parsing command line strings into Python objects.
    
        Keyword Arguments:
            - [...]
            - parents -- Parsers whose arguments should be copied into this one
        """
    

    打电话 subparsers.add_parser('parrot', parents=[parser], add_help=False)