Pyright 的递归类型别名

问题描述

使用 Pyright 检查以下代码:

from typing import Union,TypeVar

T = TypeVar('T')
X_or_RecurListOf = Union[T,list['X_or_RecurListOf']]
x: X_or_RecurListOf[str] = ['asd']

产生错误:

  5:28 - error: Expression of type "list[str]" cannot be assigned to declared type "X_or_RecurListOf[str]"
    Type "list[str]" cannot be assigned to type "X_or_RecurListOf[str]"
      "list[str]" is incompatible with "str"
        TypeVar "_T@list" is invariant
          Type "str" cannot be assigned to type "X_or_RecurListOf[Type[T@X_or_RecurListOf]]"
            Type "str" cannot be assigned to type "T@X_or_RecurListOf"
            "str" is incompatible with "list[X_or_RecurListOf]" (reportGeneralTypeIssues)
1 error,0 warnings,0 infos 
Completed in 0.677sec

我做错了吗?
还是我误解了 announcement for support of recursive types in Pyright

解决方法

哦,我发现了 Pyright 绊倒的东西!

它希望在递归定义中有类型参数:
X_or_RecurListOf = Union[T,list['X_or_RecurListOf[T]']] - 注意 [T]

我不明白为什么这是必要的,但它对我有用,尤其是因为我真正的意思是 X_or_RecurListOf[T] 而不是 X_or_RecurListOf[Any]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...