Необычный python синтаксис функции-оболочки - PullRequest
0 голосов
/ 08 февраля 2020

Я изучаю django учебное пособие по каналам , и меня сбивает с толку синтаксис async_to_syn c в модуле asgiref.syn c

В частности

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

В нем говорится, что async_to_syn c - это обертка, которая кажется взаимозаменяемым термином с декоратором (пожалуйста, исправьте меня, если это не так), но я не могу найти какой-либо документация, где декораторы имеют синтаксис

func_one(func_two)(args)

Каков поток этой строки? Сначала вызывается func_one или func_two? И как возвращаются возвращаемые значения?

1 Ответ

2 голосов
/ 08 февраля 2020
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")
...