不寻常的 python 函数包装器语法

Unusual python function wrapper syntax

我正在经历 django channels tutorial and I'm baffled by the async_to_sync syntax in the asgiref.sync module

具体

async_to_sync(self.channel_layer.group_add)(
    self.room_group_name,
    self.channel_name
)

它说 async_to_sync 是一个包装器,它似乎是一个可以与装饰器互换的术语(如果不是这种情况,请纠正我)但是我找不到任何装饰器具有语法的文档的

func_one(func_two)(args)

这条线路的流量是多少?是 func_one 还是 func_two 先调用? return 值是如何传递的?

def wrapper(func):
    def inner(*args):
        return (output.uppercase() for outputs in func())

    return inner

您可以通过两种方式使用装饰器 wrapper

wrapper(function)("Hello", "World")

或者,更传统的方式:

@wrapper
def function(*args):
    print(args)

function("Hello", "World")

两个输出:

('HELLO', 'WORLD')

函数 wrapper returns 函数 inner(),它修改 function() 调用的输出。一些伪代码:

wrapper(function)("Hello", "World")
    inner("Hello", "World")
        output = function("Hello", "World")
        output = output.modified # ("HELLO", "WORLD")
    return output # ("HELLO", "WORLD")