You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python自定义类类型提示中|运算符失效触发TypeError问题

问题原因分析

你遇到的错误是因为在类型提示中混用了字符串字面量类型('MyClass1')和泛型类型对象(list['MyClass1']),Python将|运算符当成了普通的位运算,而非PEP 604定义的类型联合语法。'MyClass1'是字符串类型,list['MyClass1']属于types.GenericAlias类型,这两种类型无法通过|运算,因此触发TypeError。

解决方案

以下几种方法可以修复这个问题:

1. 直接引用已定义的类(推荐)

由于MyClass1在MyClass2之前已经定义完成,不需要用字符串转发引用,直接使用类名即可:

class MyClass1:
    def __init__(self, ID: str) -> None:
        pass

class MyClass2:
    def __init__(self, variables: MyClass1 | list[MyClass1]) -> None:
        self.variables: list[MyClass1] = to_list(variables)

2. 给整个联合类型加字符串包裹

把整个类型联合表达式放在字符串中,这样Python会将其视为延迟解析的类型提示,不会执行|运算:

class MyClass2:
    def __init__(self, variables: 'MyClass1 | list[MyClass1]') -> None:
        self.variables: list['MyClass1'] = to_list(variables)

3. 使用typing.Union替代|运算符

如果你习惯使用旧的类型提示语法,可以导入Union来定义联合类型:

from typing import Union, List

class MyClass2:
    def __init__(self, variables: Union[MyClass1, List[MyClass1]]) -> None:
        self.variables: List[MyClass1] = to_list(variables)

4. 统一使用字符串转发(通用延迟解析方案)

如果场景中需要延迟解析类型(比如MyClass1定义在MyClass2之后),可以把泛型内的类型也用字符串包裹,同时用Union定义联合类型:

from typing import Union, List

class MyClass2:
    def __init__(self, variables: Union['MyClass1', List['MyClass1']]) -> None:
        self.variables: List['MyClass1'] = to_list(variables)

class MyClass1:
    def __init__(self, ID: str) -> None:
        pass

内容的提问来源于stack exchange,提问作者bemy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:17:14