如何解决如何命名NamedTemporaryFile?
我按照Type hint for a file or file-like object?中的建议尝试了typing.IO
,但没有用:
from __future__ import annotations
from tempfile import NamedTemporaryFile
from typing import IO
def example(tmp: IO) -> str:
print(tmp.file)
return tmp.name
print(example(NamedTemporaryFile()))
为此,mypy告诉我:
test.py:6: error: "IO[Any]" has no attribute "file"; maybe "fileno"?
并且Python运行正常。这样代码就可以了。
解决方法
我认为这不太容易键入提示。
如果检查NamedTemporaryFile
的定义,您会发现它是一个以以下结尾的函数:
return _TemporaryFileWrapper(file,name,delete)
_TemporaryFileWrapper
被定义为:
class _TemporaryFileWrapper:
这意味着没有可以指示的超类,并且_TemporaryFileWrapper
是“模块专用”的。它也似乎没有任何使其成为现有Protocol
的一部分的成员(Iterable
和ContextManager
除外;但是您这里没有使用这些方法)。
我认为您需要使用_TemporaryFileWrapper
并忽略警告:
from tempfile import _TemporaryFileWrapper # Weak error
def example(tmp: _TemporaryFileWrapper) -> str:
print(tmp.file)
return tmp.name
如果您真的想要一个干净的解决方案,可以implement your own Protocol
包含所需的属性,并使其也继承自Iterable
和ContextManager
。然后,您可以使用自定义Protocol
进行提示。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。