python - 如何输入泛型函数?

假设我想在 Python 中定义一些与 Java 中的以下函数完全相同的函数:

public <T> void func(T a, T b):
     ...

这段代码只是意味着 func 可以将任何 ab 作为输入,只要它们具有相同的数据类型。

Python 本身没有显式类型检查,但现在我正在使用 mypy 检查我的代码。我的尝试如下:

T = TypeVar('T')

def func(a: Generic[T], b: Generic[T]):
         ...
func(1, 3)  # this should be a legal input since 1 and 3 are both int

T = TypeVar('T')

class A(Generic[T]):
    pass

def func(a: A[T], b: A[T]):
    ...
func(1, 3)

但是,mypy 会报告两者的错误。有没有办法让我们像在Java中一样定义这样的泛型函数来通过mypy检查?我知道为了对我的代码进行完整性检查,我还可以在函数内部检查 type(a) 是否等于 type(b) ,但这不是我的目的.我对我的问题特别感兴趣,即如何定义这样一个通用函数来通过 mypy 检查?

最佳答案

该 Java 函数实际上并没有按照您的意愿执行,而 Python 等价物也不会按照您的意愿执行。

您要确保调用 Java 函数时始终使用相同类型的两个参数,但任何您可能传递给它的两个对象共享一个类型。具体来说,任何两个对象都是 Object 的实例。 (null 和原语使事情变得有点复杂,但它们不会停止类型检查的调用。)任何调用都将进行类型检查,而您尝试使用泛型将无济于事。

类似地,Python 等价物是

def func(a: T, b: T):
    ...

和 Java 代码一样,任何调用都会进行类型检查,因为任何两个对象都是 object 的实例。


无法使用类型注释指定 type(a) is type(b) 的约束。无论如何,这通常是错误的约束。您通常想要指定的是参数在某种程度上相互兼容。不幸的是,也没有真正好的方法来做到这一点。

例如,如果你想在 Java 中指定两个参数可以相互比较,那就是

public <T extends Comparable<T>> void func(T a, T b) {...}

但是,Python 类型变量不支持这样的参数化边界。

https://stackoverflow.com/questions/58584812/

相关文章:

python - 为什么当前模块中没有__dict__?

asp.net - 在 Windows Server 上无法确定重定向的 https 端口,但在 P

android-studio - 默认显示布局的横向版本

python - Flask:flask 在 conda 环境中运行不工作 - Windows、Py

reactjs - ThemeProvider/Typescript 错误 : Types of p

visual-studio - 强制 Visual Studio 从光标处查找

sql - 我需要使用 join fetch,但它会导致 "query specified join

javascript - 如何从 HTML 中的颜色选择器中删除 "other..."选项?

rust - 可以为 Rust 中的元组定义 Ord 吗?

django - this.$apollo 始终未定义