为什么 Annotated[str, T] 不起作用,而 Annotated[T, str] 效果很好?

问题描述 投票:0回答:1

我有一个项目,用户需要经常使用

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}]
python python-typing
1个回答
0
投票

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
的实例时执行此操作,而不是在定义类型提示时执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.