2017-11-01 6 views
0

コンテキスト:私は、ストレージ製品用の単純な(読み取り専用の)Python APIクライアントを動的に構築しようとしています。Python:__getattr__からkwargsを動的に取得する方法

状況:

  • /モニター/ホスト[GET]をのnodeId = XXXを[&領域= XXX]
  • [GET] /モニター/ノードリスト: APIサーバは、このようなエンドポイントを持って? 【領域= XXX]
  • [GET] /システム/バージョン
  • /使用

マイIDを[GET]各エンドポイント(モニター、システム、使用法など)のクラスを作成し、次に「子エンドポイント」(太字:/ monitor/ホストまたは/ monitor/ノードリストなど)を動的に取得することでした。 、私はまだ、すべてのURLを取得する必要がありますパラメータ(常にオプションであり、唯一のことができます。のnodeIdおよび/または地域、など)...私はこのような何かを持っている用法:

client = WhateverStorageApi() 
client.monitor.host(hostId='node01', region='eu-west-1') 
# the above would generate a str: /monitor/host?nodeId=node01&region=eu-west-1 

私の問題は次のとおりです:__ getattr__はどんな** kwargsも認識しておらず、__ call__はクラスを呼び出すたびにしか機能しません。これは私に質問につながります。これをeving?または、私の使用法のアイデアは完全に非意味ですか?私は解決策を見つけた

答えて

0

(これは私が知っている...それは単に動作しません)

class Monitor(object): 

    base_url = 'monitor' 

    def __getattr__(self, endpoint, **kwargs): 

     base_call = '/{base_url}/{endpoint}'.format(
      base_url=Monitor.base_url, 
      endpoint=endpoint 
     ) 

     if 'nodeId' in kwargs.keys(): 
      base_call += '?nodeId={node_id}'.format(
       node_id=kwargs['nodeId'] 
      ) 

     if 'region' in kwargs.keys(): 
      base_call += '?region={region}'.format(
       region=kwargs['region'] 
      ) 

     # do something with base_call 

class Monitor(object): 

    base_url = 'monitor' 

    def __getattr__(self, endpoint): 

     def handler(**kwargs): 
      return self._inner_getattr(endpoint, **kwargs) 
     return handler 

    @staticmethod 
    def _inner_getattr(endpoint, **kwargs): 

     base_call = '/{base_url}/{endpoint}'.format(
      base_url=Monitor.base_url, 
      endpoint=endpoint 
     ) 

     if 'nodeId' in kwargs.keys(): 
      base_call += '?nodeId={node_id}'.format(
       node_id=kwargs['nodeId'] 
      ) 

     if 'region' in kwargs.keys(): 
      base_call += '?region={region}'.format(
       region=kwargs['region'] 
      ) 

     return base_call 


a = Monitor() 
print a.node(nodeId="bla", region="blabla") 

出力:

/monitor/node?nodeId=bla?region=blabla 
例えば、私が思い付きました
関連する問題