我有一个项目,用户需要经常使用
Annotated[str, MyType()]
。为了简化它,我尝试创建一个泛型类型
T = TypeVar('T')
CustomUrl = Annotated[str, T]
但是当我尝试以这种方式使用它时出现此错误:
CustomUrl[MyData()]
# TypeError: typing.Annotated[str, ~T] is not a generic class
我不知道为什么会发生这种情况,当我将顺序颠倒到
时效果很好CustomUrl[T, str]
但这不是我想要的。有什么办法可以让它发挥作用吗?
我的用例是让用户声明一个数据类,它将自动生成一个 UI 模式,例如
# pseudo code
@dataclass
class TaskArgs:
input_text: Annotated[str, {'multiline': True}]
input_file: Annotated[str, {'multifiles': True}]
Annotated
的
first参数必须是您要附加元数据的类型,后续参数是元数据。
在您的情况下,
Annotated[str, T]
是说:“用元数据str
注释类型T
”。但 T
是 TypeVar
,这意味着它是任何类型的占位符,而不是特定类型的元数据。我的朋友,这就是当您使用 TypeError
时得到 CustomUrl[MyData()]
的原因。 MyDtata()
是一个实例,而不是类型,因此它不能用作 TypeVar
。
如果您想创建一个始终使用
Annotated
作为基本类型并允许用户指定元数据的自定义 str
类型,请按如下操作:
T = TypeVar('T')
class CustomUrl(Annotated[str, T]):
pass
如果您想将
MyData
的实例附加为元数据,则需要在创建 CustomUrl
的实例时执行此操作,而不是在定义类型提示时执行此操作。