Можно ли использовать методы для декораторов? - PullRequest
0 голосов
/ 06 августа 2020

Я просматривал примеры aiort c, когда заметил декоратор, у которого есть метод:

@pc.on("datachannel")
    def on_datachannel(channel):
    ...

Я действительно не понимаю, как это работает или что делает этот код. Я искал декораторы, и я знаю, что можно иметь декораторы классов, но не об использовании методов. Кто-нибудь может уточнить это?

1 Ответ

1 голос
/ 06 августа 2020
@foo
def bar(): ...

Этот синтаксис просто сахар для этого:

def bar(): ...
bar = foo(bar)

Итак, это:

@pc.on('datachannel')
def on_datachannel(channel): ...

то же самое, что:

def on_datachannel(channel): ...
on_datachannel = pc.on('datachannel')(on_datachannel)

pc - это некоторый объект, pc.on - это метод на нем, pc.on('datachannel') вызывает его и возвращает функцию, pc.on('datachannel')(on_datachannel) вызывает эту возвращенную функцию, передавая ей функцию on_datachannel.

Реализация of pc.on выглядит примерно так:

class PC:
    def on(self, event):
        ...
        def wrapper(fn):
            ...
            def inner_wrapper(*args, **kwargs):
                ...
                fn(*args, **kwargs)

            return inner_wrapper

        return wrapper

pc = PC()

Вся эта внутренняя часть полностью является обычным декоратором, принимающим аргументы. То, что он определен в классе, не имеет для него никакого значения.

...