Python 如何在PyCharm中正确注释ContextManager?

Python 如何在PyCharm中正确注释ContextManager?,python,pycharm,python-typing,contextmanager,Python,Pycharm,Python Typing,Contextmanager,我如何在PyCharm中注释contextmanager的收益类型,以便它正确地猜测with子句中使用的值的类型,就像它猜测在with open(…)中创建的f作为f是一个文件一样 例如,我有这样一个上下文管理器: @contextlib.contextmanager def temp_borders_文件(几何体:geometry,name='borders.json'): 临时目录()作为临时目录: borders\u file=路径(dir)/名称 使用borders_file.open(

我如何在PyCharm中注释
contextmanager
的收益类型,以便它正确地猜测
with
子句中使用的值的类型,就像它猜测在
with open(…)中创建的
f
作为f
是一个文件一样

例如,我有这样一个上下文管理器:

@contextlib.contextmanager
def temp_borders_文件(几何体:geometry,name='borders.json'):
临时目录()作为临时目录:
borders\u file=路径(dir)/名称
使用borders_file.open('w+')作为f:
f、 write(geometry.json)
屈服边界
使用临时边界文件(my_geom)作为边界:
是否使用(边框)进行编码
如何让PyCharm知道像这样创建的每个
border\u f
都是
pathlib.Path
(从而启用
border\u f
上的
Path
方法的自动完成)?当然,我可以在每个带有语句的
之后做一个类似于
#type:Path
的注释,但这似乎可以通过正确注释
临时边界文件
来完成


我尝试了
Path
键入.Iterator[Path]
键入.Generator[Path,None,None]
作为
temp_border_file
的返回类型,并在上下文管理器的代码中添加
borders_file
上的
type:Path
,但是它似乎没有帮助。

我相信您可以使用
中的
上下文管理器
,例如:

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

这是当前的一个问题:

该问题的解决方法是重写以下示例代码:

从contextlib导入contextmanager
@上下文管理器
def生成器_函数():
产生“一些价值”
使用生成器函数()作为值:
打印(value.upper())#无PyCharm自动完成

从contextlib导入contextmanager
从键入import ContextManager开始
def wrapper()->ContextManager[str]:
@上下文管理器
def生成器_函数():
产生“一些价值”
返回生成器_函数()
使用包装器()作为值:
打印(value.upper())#PyCharm自动完成功能有效
使用
ContextManager[str]
注释返回类型也有一个更简单的解决方法,但有多个原因反对这种做法:

  • mypy将正确发出此注释的错误,如PyCharm问题中更详细的描述
  • 这并不能保证在将来起作用,因为PyCharm有望解决这个问题,从而打破这个解决方法

谢谢!我们将很快尝试此功能—为此需要Python 3.6。