是否有任何正确的类型提示用于Python中的文件或类文件对象?例如,我如何键入提示此函数的返回值?
def foo():
return open('bar')
Run Code Online (Sandbox Code Playgroud) 我有一个生成字符串列表的生成器.Python中是否有一个实用程序/适配器可以使它看起来像一个文件?
例如,
>>> def str_fn():
... for c in 'a', 'b', 'c':
... yield c * 3
...
>>> for s in str_fn():
... print s
...
aaa
bbb
ccc
>>> stream = some_magic_adaptor(str_fn())
>>> while True:
... data = stream.read(4)
... if not data:
... break
... print data
aaab
bbcc
c
Run Code Online (Sandbox Code Playgroud)
因为数据可能很大并且需要可流传输(每个片段都是几千字节,整个流是几十兆字节),我不想在将整个生成器传递给流适配器之前急切地评估整个生成器.
在下面的代码中,我有一个可以接受字符串或某些TextIOBase. 如果传递一个字符串,它将被解释为应该打开和读取的文件的路径。如果TextIOBase传递 a,则将读取该流的内容:
from typing import Union
import io
def function(foo: Union[str, io.TextIOBase]) -> None:
if isinstance(foo, str):
foo = open(foo, "w")
Run Code Online (Sandbox Code Playgroud)
这看起来应该没问题,因为 Union 应该是协变的,这意味着 union 中类型之一的子类应该满足类型注释,在这种情况下, 的输出类型是 的子open()类TextIOBase。然而,mypy 抱怨:
from typing import Union
import io
def function(foo: Union[str, io.TextIOBase]) -> None:
if isinstance(foo, str):
foo = open(foo, "w")
Run Code Online (Sandbox Code Playgroud)
open()我认为根据传递的参数,返回类型的歧义可能存在问题,因此我尝试改为使用 a StringIO,但得到了相同的错误。有什么想法吗?mypy 为什么对我生气?
我还尝试过使用一些玩具类(例如Union[str, T1],然后分配一个T2,其中T2是 T1 的子类),mypy对此非常满意。