Python装饰器代码在原始功能代码之前运行

dma*_*man 0 python decorator python-2.7 python-decorators

def raw_list(function):
    @wraps(function)
    def wrapper(args, producer_data):
        print producer_data[2]
        tenant, token, url = producer_data
        body, status_code = do_request(url, token)
        return function(args, producer_data)
    return wrapper

@raw_list
def member_list(args, producer_data):
    # in argparse, consumer or producer data can be used because
    # consumer is aliased to producer.
    uuid = args['uuid']
    producer_data[2] = producer_data[2] + "/" + uuid + "/members"
Run Code Online (Sandbox Code Playgroud)

我有几个函数可以获取URL,对其进行修改,并使用URL进行API调用.出于这个原因,我为API调用部分创建了一个包装函数.因此,每个函数只需要改变URL并用包装函数进行修饰.

但我遇到的问题是,变异的URL代码producer_data[2] = producer_data[2] + "/" + uuid + "/members"似乎在函数装饰器代码运行之后运行,而不是之前.因此,使用原始URL而不是变异URL.

如何修复此逻辑流并将其调用到使用变异URL进行API调用的位置?

use*_*ica 5

如果您希望在包装器的其余代码之前调用修饰函数,请在包装器代码的其余部分之前调用它:

def raw_list(function):
    @wraps(function)
    def wrapper(args, producer_data):
        # Call it here!
        retval = function(args, producer_data)
        print producer_data[2]
        tenant, token, url = producer_data
        body, status_code = do_request(url, token)
        return retval
    return wrapper
Run Code Online (Sandbox Code Playgroud)