我有一个类,在它的init中接受int或float,但都必须是int或float,所以我使用typing.overload来实现这一点,我希望能够根据给定的值输入hint函数的返回值.

class Vector3:
    @overload
    def __init__(self, x: int, y: int, z: int) -> None:
        ...
    @overload
    def __init__(self, x: float, y: float, z: float) -> None:
        ...

    def __init__(self, x, y, z) -> None:
        self._x = x
        self._y = y
        self._z = z

    # This function
    def __key(self) -> tuple[int | float, int | float, int | float]:
        return (self._x, self._y, self._z)

另外,我应该如何输入提示x、y和z的值?我计划使用@property来混淆_x、_y、_z值,我也不知道如何输入hint它们.

@property
def x(self) -> int | float:
    return self._x

推荐答案

千万不要让__init__辆超载.改为使用受约束的类型变量使Vector3成为泛型.

from typing import Generic, TypeVar

T = TypeVar('T', int, float)

class Vector3(Generic[T]):
    def __init__(self, x: T, y: T, z: T) -> None:
        self._x: T = x
        self._y: T = y
        self._z: T = z

    def __key(self) -> tuple[T, T, T]:
        return (self._x, self._y, self._z)

    @property
    def x(self) -> T:
        return self._x

    # etc

然后

reveal_type(Vector3(1, 2, 3))  # Vector3[int]
reveal_type(Vector3(1., 2., 3.)) # Vector3[float]
reveal_type(Vector3(1, 2, 3.)) # Vector3[float], via promotion of int values to floats
reveal_type(Vector3('1', '2', '3'))  # type error, T cannot be bound to str

请注意,在此上下文中,int被视为float的子类型.

Python相关问答推荐

try 与gemini-pro进行多轮聊天时出错

比较2 PD.数组的令人惊讶的结果

运行总计基于多列pandas的分组和总和

如何从具有不同len的列表字典中创建摘要表?

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

DataFrames与NaN的条件乘法

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

多处理队列在与Forking http.server一起使用时随机跳过项目

UNIQUE约束失败:customuser. username

Python Pandas获取层次路径直到顶层管理

未调用自定义JSON编码器

在Python中使用yaml渲染(多行字符串)

如何在Great Table中处理inf和nans

将链中的矩阵乘法应用于多组值

从嵌套极轴列的列表中删除元素

获取PANDA GROUP BY转换中的组的名称

如何将返回引用的函数与pybind11绑定?

将鼠标悬停在海运`pairplot`的批注/高亮显示上

Django REST框架+Django Channel->;[Errno 111]连接调用失败(';127.0.0.1';,6379)

如何使用count()获取特定日期之间的项目