Subparsers.add_parser TypeError: __init__() 得到了一个意外的关键字参数“prog”

Posted

技术标签:

【中文标题】Subparsers.add_parser TypeError: __init__() 得到了一个意外的关键字参数“prog”【英文标题】:Subparsers.add_parser TypeError: __init__() got an unexpected keyword argument 'prog' 【发布时间】:2018-05-29 18:02:11 【问题描述】:

我需要实现一个 ArgParse 构建器来生成解析器以及关于子解析器和参数。我创建了一个装饰器来将子解析器声明为动作。这是包含装饰器的类:

class Controller(object):
    endpoints = None
    parser = None
    subparsers = None

    def __init__(self, endpoint=None):
        from src.app.commons.ArgParser import ArgParser
        if not self.parser:
            self.parser = ArgParser()
        # Get all 
        self.endpoints = utilities.conf_wrapper()
        self.mod = endpoint
        if not self.subparsers:
            self.subparsers = self.parser.add_subparsers(help=gettext('%s_SUBPARSER_HELP' % str(self.mod).upper()))
        self.parser.add_argument_group(self.mod, gettext('%s_GROUP_DESC' % str(self.mod).upper()))


    def endpoint(self, endpoint, **kwargs):
        """ Create an endpoint to define a method on behalf of subparser"""
        ref = self
        def decorator(f):
            """
            Create subparser for controller object
            @param f as a function to call
            @return decorator method
            """
            # TODO Set given function f as a subparser destination
            new_sub_parser = ref.subparsers.add_parser(endpoint, help=gettext('%s_%s_HELP' % (ref.mod, endpoint)))
            [new_sub_parser.add_argument("--%s" % arg, action='store') for arg in ref.endpoints[ref.mod][endpoint]["params"]]
            setattr(ConsoleInterface, 'do_%s' % endpoint, f)

        return decorator

这是我在课堂上的称呼:

from src.app.controller import Controller

network = Controller("network")


@network.endpoint('create')
def create(*args):
    try:
        print "I am here"
    except Exception as err:
        print err

我在这里期待的是创建一些解析器作为这样的命令:

$~ network create [arguments]

根据 ArgParse docs 我做的一切都是正确的,但我得到了这样的例外:

  File "/projectpath/src/app/controller/__init__.py", line 48, in decorator
    new_sub_parser = ref.subparsers.add_parser(endpoint, help=gettext('%s_%s_HELP' % (ref.mod, endpoint)))
  File "/usr/lib/python2.7/argparse.py", line 1066, in add_parser
    parser = self._parser_class(**kwargs)
  TypeError: __init__() got an unexpected keyword argument 'prog'

当我查看 ArgParse._SubParsersAction.__init()__ 时,它涵盖了 kwargs 中的“prog”。

【问题讨论】:

这可能会有所帮助:bugs.python.org/issue23487 还有这个:***.com/questions/33574270/… 【参考方案1】:

我遇到了同样的问题!

我创建了我的类 ArgParser,它扩展了 argparse.ArgumentParser,在其中,我调用了 self.add_subparsers(),导致了这个问题。

class ArgParser(argparse.ArgumentParser):
    """A class to group all the arg parse stuff.
    You dont need to pay attention here unless you want to edit CLI args spec"""

    def __init__(self):
        p_args = dict(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
        super().__init__(**p_args)
        self.add_argument('-v', '--version', action='version', version=f'%(prog)s __version__')
        sub_ps = self.add_subparsers(dest='cmd')
        sub_ps.required = True
        # ...  and lot other stuff

所以,这导致TypeError: __init__() got an unexpected keyword argument 'prog'

如何解决?

显式设置parser_class=argparse.ArgumentParser,如

sub_ps = self.add_subparsers(dest='cmd', parser_class=argparse.ArgumentParser)

【讨论】:

【参考方案2】:

问题可能出在ArgParser() 类上。我不知道那是什么,尽管它可能是定制的argparse.ArgumentParser(作为子类)。

add_parser 确保kwargs 中有一个prog,然后将其传递给parser = self._parser_class(**kwargs)_parser_class 是主解析器的类,除非在 add_subparsers 行中指定了替代项。

所以我猜ArgParser 不接受prog 关键字,尽管ArgumentParser 接受。但我认为如果不进一步了解其来源,我们就无法为您提供帮助。

【讨论】:

感谢@hpaulj 的灵感!我使用从 ArgumentParser 继承的我自己的类 ArgParse 并且我没有将 **kwargs 放入构造函数中。 class ArgParser(argparse.ArgumentParser): def __init__(self, **kwargs): 这就是它发生的原因。我修好了它。感谢您的帮助。

以上是关于Subparsers.add_parser TypeError: __init__() 得到了一个意外的关键字参数“prog”的主要内容,如果未能解决你的问题,请参考以下文章

错误(13,34):PLS-00201:必须声明标识符“D.BNDNG_TYP”

css Erstes oder letztes Element von einem Typ selektieren

oracle 查看16进制

css CSS-Selektoren:Erstes oder letztes Element von einem Typ

如何解决xp系统 ‘未安装ADO’‘ 请安装MDAC_typ。exe安装这个如何解决 不要说安装纯洁系统啥的。

两个嵌套表集合之间的plsql区别