此解决方案并不等同于您正在寻找的解决方案:
你可以拥有任何对象 x,只要x.readline() -> str
相反,我们定义了一个自定义抽象基类,它期望 readline 抽象方法由其子类定义。因此,它不会接受任何随机对象,而是只接受这个新抽象基类的实例,使其更加明确。
from abc import ABC, abstractmethod
class FileObject(ABC):
@abstractmethod
def readline(self):
raise NotImplementedError()
现在我们要定义一个自定义类型,它可以与 Python 的文件对象和 FileObject 的实例一起使用:
from typing import IO, TypeVar
StreamType = TypeVar('StreamType', IO, FileObject)
def func(name: str, stream: StreamType) -> None:
pass
现在让我们使用mypy对其进行测试:
from io import StringIO, BytesIO
class X(FileObject):
def readline(self):
pass
func('a', StringIO()) # passed
func('a', BytesIO()) # passed
func('a', open('foo.txt')) # passed
func('a', X()) # passed
func('a', object()) # failed
func('a', []) # failed
func('a', 1) # failed
输出:
$ mypy so.py
so.py:33: error: Type argument 1 of "func" has incompatible value "object"
so.py:34: error: Type argument 1 of "func" has incompatible value List[None]
so.py:35: error: Type argument 1 of "func" has incompatible value "int"