Python 如何在PyCharm中正确注释ContextManager?
我如何在PyCharm中注释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(
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。