Python装饰程序代码在原始函数代码之前运行

Python装饰程序代码在原始函数代码之前运行,python,python-2.7,decorator,python-decorators,Python,Python 2.7,Decorator,Python Decorators,我有几个函数可以获取URL,对其进行变异,并使用URL进行API调用。出于这个原因,我为API调用部分制作了一个包装器函数。因此,每个函数只需要改变URL并用包装器函数修饰 但我遇到的问题是,经过变异的URL代码producer_data[2]=producer_data[2]+“/”+uuid+“/members”似乎是在函数decorator代码运行之后而不是之前运行的。因此,将使用原始URL而不是经过修改的URL 如何修复此逻辑流并使其到达使用变异URL进行API调用的位置?如果希望在包装

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

但我遇到的问题是,经过变异的URL代码
producer_data[2]=producer_data[2]+“/”+uuid+“/members”
似乎是在函数decorator代码运行之后而不是之前运行的。因此,将使用原始URL而不是经过修改的URL


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

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

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"

@xxx
def yyy(): pass

这可能会有所帮助。

它将在decorator代码之后运行,因为对函数的调用位于包装的末尾。您发出请求并将其分配给
body
status\u code
(尽管您从未对这些值执行任何操作),然后调用
member\u list
。它会修改
生产者\u数据
,但到那时已经太晚了。

修改URL的方法被称为decorator的最后一条语句,这意味着传递给
do\u request
函数的URL是原始URL。
您需要首先调用修饰函数以获取API URL,然后实际调用
do\u请求

当然它会在之后运行,您可以在修饰器中调用它!为什么要存储
body
status\u code
,然后立即扔掉?它是否只是提醒您请求返回的内容?某些函数稍后可能会使用它们
@xxx
def yyy(): pass
def yyy(): pass
yyy = xxx(yyy)