2017-10-26 19 views
0

にvarsは:Pythonのアクセス機能は、私は次のようにしたいデコレータ

のiは、以下の機能を持っているとしましょう:

def query(self, url, method = 'GET',payload=None): 
    if method == "GET": 
     result = requests.get(self.api_base_url+url, auth=self.__auth_token, verify=False) 
     print (result) 
    elif method == "POST": 
     result = requests.post(self.api_base_url+url, auth=self.__auth_token, data=payload, verify=False) 
     print(result) 
    elif method == "PUT": 
     result = requests.put(self.api_base_url+url, auth=self.__auth_token, data=payload, verify=False) 
     print(result) 

私はそれらの残りの呼び出しが必要な時間を測定します。だから私は休憩の時間を測定するデコレータを構築し始めた。

def timing(f): 
     def wrap(*args): 
      time1 = time.time() 
      ret = f(*args) 
      time2 = time.time() 
      time_took = time2-time1 
      print (time_took) 
     return wrap 

ここではペイロードを印刷します。しかし、PUTリクエストとPOSTリクエストだけで、GETリクエストではありません。ですから、私はデコレータで引数methodをチェックする必要がありますが、私はデコレータ内でこの引数にアクセスできません。特に、私はこのような何かをしたい:

def timing(f): 
     def wrap(*args): 
      time1 = time.time() 
      ret = f(*args) 
      time2 = time.time() 
      time_took = time2-time1 
      if args[0].method == 'PUT' and args[0].method == 'POST' 
       print (time_took + args.[0].payload) 
      else: 
       print (time_took) 
     return wrap 

質問:

どのように私は私のデコレータ内の関数の引数にアクセスすることができますか?

おかげであなたがしようとしたと同様

答えて

0

が、.methodなし。 argsは引数のタプルです。あなたは引数のインデックスを追跡したくない場合は

def deco(f): 
    def inner(*args): 
     print(args[0]) 
     return f(*args) 
    return inner 


@deco 
def foo(a): 
    pass 

foo('a') 
# a 


あなたはkwargsを使用することができます。

def deco(f): 
    def inner(*args, **kwargs): 
     print(kwargs['a']) 
     print(kwargs['b']) 
     return f(*args, **kwargs) 
    return inner 


@deco 
def foo(a, b): 
    pass 

foo(a=1, b=2) 
# 1 
# 2 
+0

問題は、引数 "method"が "args"リスト内にないことです。どうして ? print args [0]は私のクラスのオブジェクトを表示します – Constantine

+0

@ Constantineこれはキーワード引数として渡すためです。私の更新された答えを見てください。 – DeepSpace

+0

kwargsは空です。なぜ私は理解していない – Constantine

関連する問題