如何给一个通用函数添加类型提示?

2024-04-25 10:00:58 发布

您现在位置: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检查?你知道吗


Tags: 函数代码功能定义deftypejavapublic
1条回答
网友
1楼 · 发布于 2024-04-25 10:00:58

这个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类型变量不支持这样的参数化边界。你知道吗

相关问题 更多 >

    热门问题