【问题标题】:Python Access function vars in decorator装饰器中的 Python Access 函数变量
【发布时间】:2018-04-07 21:55:16
【问题描述】:

我想要以下:

假设我有以下功能:

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

问题:

如何在装饰器中访问函数的参数?

谢谢

【问题讨论】:

    标签: python-2.7 arguments decorator


    【解决方案1】:

    就像你尝试过的一样,但没有.methodargs 是一个参数元组。

    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
    

    【讨论】:

    • 问题是,参数“method”不在“args”列表中。为什么 ? print args[0] 打印我班级的对象
    • @Constantine 因为您将它作为关键字参数传递。请参阅我的更新答案。
    • kwargs 是空的。我不明白为什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多