我有一个“智能”打开函数,可以打开各种文件并返回IO-ish对象类型:
def sopen(anything_at_all: str, mode: str) -> FileIO:
...
我在打印语句中使用它,如:
with sopen('footxt.gz', mode = 'w+') as fout:
print("hello, world!", file=fout)
然后,当使用mypy
0.812分析此代码时,我得到以下神秘错误:
Argument "fout" to "print" has incompatible type "FileIO"; expected "Optional[SupportsWrite[str]]"
好的,很好:SupportsWrite
肯定比FileIO
好,只有一个问题:当我调整代码以支持使用_typeshed.SupportsWrite
写时,没有什么比这更好了
def sopen(anything_at_all: str, mode: str) \
-> Union[SupportsWrite[str],SupportsRead[str]]:
...
mypy
想要确切地说Optional[SupportsWrite]
:
Argument "fout" to "print" has incompatible type "Union[SupportsWrite[str], SupportsRead[str]]"; expected "Optional[SupportsWrite[str]]"
接下来,我尝试铸造,并创建某种类型的强制强制执行,但是在解释器中试用我的脚轮的过程中,当
>>> from _typeshed import SupportsRead, SupportsWrite
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named '_typeshed'
现在的根本问题是:在这种情况下,人们如何遵从mypy
的意愿
TL;DR使用
typing.IO
代替FileIO
typing.IO
支持内置open
可能返回的所有返回类型print
本身将其file
参数注释为Optional[SupportsWrite[str]]
,因此mypy
是正确的要修复丢失的
_typeshed
模块错误(同样正确,它仅在类型检查时可用,而在解释器执行代码时不可用),可以使用if TYPE_CHECKING
1技巧,然后使用字符串注释下面的几乎满足
mypy
:用
输入
typing.IO
您可以简单地使用
typing.IO
(这也恰好与open
的返回类型匹配),而不是直接处理SupportsWrite
。以下内容完全满足mypy
:1
TYPE_CHECKING
是一个常量,默认情况下为False
,并且仅由mypy
和/或其他类型分析工具设置为True
相关问题 更多 >
编程相关推荐