【发布时间】:2021-12-21 14:25:52
【问题描述】:
考虑example of a typed decorator bound to certain classes。
import unittest
from typing import *
T = TypeVar("T", bound=unittest.TestCase)
def decorate(func: Callable[[T], None]) -> Callable[[T], None]:
def decorated_function(self: T) -> None:
return func(self)
return decorated_function
现在我什至有a generator that creates these decorators 并想简写这些装饰器。我对存储装饰器的变量变量是什么类型(省略生成器的简化示例)。
my_decorate: Callable[[Callable[[T], None]], Callable[[T], None]] = decorate
这可行,但很笨重。所以问题是:
我如何为这种类型设置别名以避免编写完整的签名?
不起作用的事情:
TD = Callable[[Callable[[T], None]], Callable[[T], None]]
my_decorate: TD[T] = decorator_variable
给出错误
error: Type variable "mypytest.T" is unbound
note: (Hint: Use "Generic[T]" or "Protocol[T]" base class to bind "T" inside a class)
note: (Hint: Use "T" in function signature to bind "T" inside a function)
相比之下,我可以使用TD[T] 作为函数的参数类型。
仅使用 my_decorate: TD = ... 会产生 --strict 错误
error: Missing type parameters for generic type "TD"
它不再检测my_decorate的错误应用程序。
【问题讨论】:
-
my_decorate: TD = decorator_variable不起作用(没有将T设置为Any)? -
省略
[T]会产生--strict错误,并且不再对self执行预期的类型检查。我在问题中添加了详细信息。 -
它们(类型变量)用作泛型类型以及泛型函数定义的参数。 但是您尝试在上下文之外使用类型变量。
-
@alex_noname 你是对的。我如何在没有合理的类型别名的情况下使用?
-
您可能想查看有关键入装饰器的 Python 文档:docs.python.org/3/library/typing.html#functions-and-decorators 另外,这是 Python。请不要被整个打字过程冲昏了头脑。
标签: python mypy python-typing