如何键入通用函数?

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

说我想用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检查?

python python-3.x mypy
1个回答
0
投票
您想确保始终用相同类型的两个参数来调用Java函数,但是您可能传递的

any两个对象共享一个类型。具体而言,任何两个对象都是Object的实例。 (null和原语会使事情复杂一些,但是它们不会阻止类型检查的调用。)任何调用都将进行类型检查,并且您尝试使用泛型也无济于事。

类似地,Python等价于

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

和Java代码一样,任何调用都将键入check,因为任何两个对象都是object的实例。

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


例如,如果您想指定两个参数在Java中彼此可比,那就是

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

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

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