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
相关产品推荐
相关产品推荐

