如何在PyCharm中注解contextmanager
的yield类型,以便它正确地猜测with
子句中使用的值的类型--就像它猜测在with open(...) as f
中创建的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
(从而启用border_f
上Path
方法的自动完成)?当然,我可以在每个with
语句后添加一个注解,如# type: Path
,但似乎可以通过正确注解temp_border_file
来完成。
我尝试将Path
、typing.Iterator[Path]
和typing.Generator[Path, None, None]
作为temp_border_file
的返回类型,并在上下文管理器的代码中将# type: Path
添加到borders_file
上,但似乎没有帮助。
2条答案
按热度按时间mdfafbf11#
下面是一个肮脏的解决方案。将破坏
mypy
。最好不要使用它。我相信您可以从
typing
使用ContextManager
,例如:lskq00tm2#
这是当前的PyCharm问题:PY-36444
此问题的解决方法是重新编写以下示例代码:
至
还有一种更简单的解决方法,即使用
ContextManager[str]
注解返回类型,但有多种原因不支持这种做法: