相关疑难解决方法(0)

键入文件或类文件对象的提示?

是否有任何正确的类型提示用于Python中的文件或类文件对象?例如,我如何键入提示此函数的返回值?

def foo():
    return open('bar')
Run Code Online (Sandbox Code Playgroud)

python type-hinting

57
推荐指数
3
解决办法
1万
查看次数

调整迭代器的行为就像Python中的类文件对象一样

我有一个生成字符串列表的生成器.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)

因为数据可能很大并且需要可流传输(每个片段都是几千字节,整个流是几十兆字节),我不想在将整个生成器传递给流适配器之前急切地评估整个生成器.

python

20
推荐指数
4
解决办法
6638
查看次数

联合中 io.TextIOBase 的类型检查问题

在下面的代码中,我有一个可以接受字符串或某些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对此非常满意。

python mypy

3
推荐指数
1
解决办法
2217
查看次数

标签 统计

python ×3

mypy ×1

type-hinting ×1