Подсказка типа Python 3 для декоратораPython

Программы на Python
Ответить
Anonymous
 Подсказка типа Python 3 для декоратора

Сообщение Anonymous »

Рассмотрим следующий код:

Код: Выделить всё

from typing import Callable, Any

TFunc = Callable[..., Any]

def get_authenticated_user(): return "John"

def require_auth() -> Callable[TFunc, TFunc]:
def decorator(func: TFunc) -> TFunc:
def wrapper(*args, **kwargs) -> Any:
user = get_authenticated_user()
if user is None:
raise Exception("Don't!")
return func(*args, **kwargs)
return wrapper
return decorator

@require_auth()
def foo(a: int) -> bool:
return bool(a % 2)

foo(2)      # Type check OK
foo("no!")  # Type check failing as intended
Этот фрагмент кода работает так, как задумано. Теперь представьте, что я хочу расширить это и вместо простого выполнения func(*args, **kwargs) я хочу ввести имя пользователя в аргументы. Поэтому я изменяю сигнатуру функции.

Код: Выделить всё

from typing import Callable, Any

TFunc = Callable[..., Any]

def get_authenticated_user(): return "John"

def inject_user() -> Callable[TFunc, TFunc]:
def decorator(func: TFunc) -> TFunc:
def wrapper(*args, **kwargs) -> Any:
user = get_authenticated_user()
if user is None:
raise Exception("Don't!")
return func(*args, user, **kwargs)  #  bool:
print(username)
return bool(a % 2)

foo(2)      # Type check OK
foo("no!")  # Type check OK 

Подробнее здесь: [url]https://stackoverflow.com/questions/47060133/python-3-type-hinting-for-decorator[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»