我如何注释contextmanager
PyCharm 中a的yield类型,以便它正确猜测with
子句中使用的值的类型-就像它猜测f
created in with open(...) as f
是文件一样?
例如,我有一个这样的上下文管理器:
@contextlib.contextmanager def temp_borders_file(geometry: GEOSGeometry, name='borders.json'): with TemporaryDirectory() as temp_dir: borders_file = Path(dir) / name with borders_file.open('w+') as f: f.write(geometry.json) yield borders_file with temp_borders_file(my_geom) as borders_f: do_some_code_with(borders_f...)
如何让PyCharm知道每个这样borders_f
创建的对象都是的pathlib.Path
(从而启用上的Path
方法的自动完成功能border_f
)?当然,我可以像# type: Path
在每条with
语句之后一样发表评论,但是似乎可以通过适当地注释来完成temp_border_file
。
我试过Path
,typing.Iterator[Path]
并typing.Generator[Path, None, None]
作为返回类型的temp_border_file
,以及增加# type: Path
对borders_file
上下文管理的代码中,但似乎它并不能帮助。
我相信您可以使用ContextManager
from typing
,例如:
import contextlib from typing import ContextManager from pathlib import Path @contextlib.contextmanager def temp_borders_file() -> ContextManager[Path]: pass with temp_borders_file() as borders_f: borders_f # has type Path here