Использование dict в качестве декораторов на python - PullRequest
0 голосов
/ 21 ноября 2018

Есть какой-то способ использовать dict в качестве декоратора на python, используя синтаксис по умолчанию "@" ?

Как-то так:

from functools import wraps
def deco(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        print("WRAPPER")
        return f(*args, **kwargs)
    return wrapper

X={ "deco": deco }

# Working
@deco
def f():
    pass

# Not Working: SyntaxError: invalid syntax
@X["deco"]
def y():
    pass

f()
y()

Если изменить для использования get () на dict , эта работа, но что-то вроде этого:

# Not working: SyntaxError: invalid syntax
@X.get("deco").require(http_exception=403)
def y():
    pass

Есть какой-то способ для этого синтаксиса работать или / и почему не работает?

1 Ответ

0 голосов
/ 21 ноября 2018

Синтаксис был намеренно ограничен.См. PEP-0318 :

Оператор декоратора ограничен в том, что он может принимать - произвольные выражения не будут работать.Гвидо предпочел это из-за интуиции .

. Текущий синтаксис также позволяет объявлениям декоратора вызывать функцию, которая возвращает декоратор:

по электронной почте ссылки PEP говорит:

У меня есть чувство об этом.Я не уверен, откуда это, но у меня есть это.Возможно, я хочу, чтобы компилятор мог распознавать определенные декораторы.

Поэтому, хотя в будущем было бы довольно легко изменить синтаксис на @test, я бы хотел придерживаться более ограниченногоформа, если не представлен реальный вариант использования, где разрешение @test увеличило бы читаемость.(@foo (). bar () не считается, потому что я не ожидаю, что вам это когда-нибудь понадобится).

Поэтому создатель / ведущий автор языка решил, что разрешить любое выражениеработа в качестве декоратора привела бы к затруднению чтения кода.

Это также никогда не требуется.Вы всегда можете сделать

my_deco = X.get("deco").require(http_exception=403)
@my_deco
def somefunc():
    ...
...