新的联合速记表示“| 不支持的操作数类型:'str' 和 'type'”

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

在3.10之前,我使用

Union
来创建联合参数注释:

from typing import Union

class Vector:
    def __mul__(self, other: Union["Vector", float]):
        pass

现在,当我使用新的 union 速记语法时:

class Vector:
    def __mul__(self, other: "Vector" | float):
        pass

我收到错误:

TypeError:| 不支持的操作数类型:“str”和“type”

不支持吗?

python python-typing python-3.10
1个回答
32
投票

它被用作类型提示这一事实并不重要;它只是被用作类型提示。从根本上来说,表达式

"Vector" | float
是一个类型错误,因为字符串不支持
|
运算符,它们不实现
__or__
。要通过此考试,您有三个选择:

  1. 推迟评估(参见PEP 563):

    from __future__ import annotations
    
    class Vector:
        def __mul__(self, other: Vector | float): ...
    
  2. 使整个类型成为字符串(实际上与延迟评估相同):

    class Vector:
        def __mul__(self, other: "Vector | float"): ...
    
  3. 继续使用

    Union

    from typing import Union
    
    class Vector:
        def __mul__(self, other: Union["Vector", float]): ...
    

您可以看到关于 这个 bug 的进一步讨论,但尚未有解决方案。

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