在 python 类型提示中,如何让参数接受基类的任何子类?

Sal*_*ley 7 python type-hinting

我有一个看起来有点像这样的函数。我希望该函数接受 io.IOBase 的任何子类 - 换句话说,任何类似文件的对象。

def import_csv_file(f:io.IOBase)->pandas.DataFrame:
    return pandas.read_csv(f)
Run Code Online (Sandbox Code Playgroud)

当我在 IntelliJ 中查看对象时,类型提示的 JetBrains 实现会拒绝任何输入,除非我提供了一个 io.IOBase 的实例——但是如果我想传入一个 io.IOBase 的子类的实例怎么办?有没有办法更改类型提示以说这是允许的?

Eug*_*ash 6

如果您使用基类(io.IOBase在您的情况下)注释函数参数,那么您还可以传递基类的任何子类型的实例 - 继承也适用于注释类型。

也就是说,您可以将其typing.IO用作表示任何 I/O 流(typing.TextIO以及分别typing.BinaryIO用于二进制和文本 I/O 流)的泛型类型。