首页 > 解决方案 > 不寻常的python函数包装语法

问题描述

我正在阅读django 频道教程,我对asgiref.sync 模块中的 async_to_sync 语法感到困惑

具体来说

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 是先调用的吗?以及返回值是如何传递的?

标签: pythondjango-channelsasgi

解决方案


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返回inner()修改function()调用输出的函数。一些伪代码:

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

推荐阅读