2017-12-15 16 views
1

パーサーを生成し、サブパーザーと引数については、ArgParseビルダを実装する必要があります。サブパーザをアクションとして宣言するデコレータを作成しました。ここではデコレータが含まれているクラスは、次のとおりです。Subparsers.add_parser TypeError:__init __()に予期しないキーワード引数 'prog'があります

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'をカバーしています。

+0

これは役立つかもしれません:https://bugs.python.org/issue23487これも:https://stackoverflow.com/questions/33574270/typeerror-init-got-an-unexpected-keyword-argument-type-in -argparse – BoboDarph

答えて

0

問題はArgParser()クラスである可能性があります。私はそれが何であるかわからないが、カスタマイズされたargparse.ArgumentParser(サブクラスとして)かもしれない。

add_parserkwargsprogがあることを確認してからparser = self._parser_class(**kwargs)に渡します。 _parser_classは、代替パーサーがadd_subparsers行に指定されていない限り、メインパーサーのクラスです。

ArgParserprogというキーワードを受け入れないと思いますが、ArgumentParserでもそうです。しかし私は、その源についてもっと知らずに、私たちがあなたを助けることはできないと思っています。

+0

インスピレーションをありがとう@hpaulj! ArgumentParserから継承した自分のクラスArgParseを使用していますが、私は** kwargsをコンストラクタに入れませんでした。 (self、** kwargs): ' それは起こるのです。それを私が直した。手伝ってくれてありがとう。 –

関連する問題