如何告诉PyCharm异步装置返回什么

时间:2019-04-17 08:57:58

标签: python async-await pycharm pytest

示例:

import pytest


@pytest.fixture
async def phrase():
    return 'hello world'


@pytest.fixture
async def replaced(phrase):
    return phrase.replace('hello', 'goodbye')

方法.replace为黄色,警告内容为:

Unresolved attribute reference 'replace' for class 'Coroutine'

但是,这些固定装置正在工作。如果我从async中删除了def phrase():,则Pycharm正确处理了.replace,表明它是类str的方法。有没有办法告诉PyCharm:phrasereplaced中使用时将是str的实例,而不是Coroutine?最好,对于每个将使用phrase的装置,不重复代码。

1 个答案:

答案 0 :(得分:1)

这不是您的代码,而是Pycharm问题-它无法正确解析本机协同程序夹具的返回类型。 Pycharm将解决旧的基于生成器的协程夹具

@pytest.fixture
async def phrase():
    yield 'hello world'

作为Generator[str, Any, None],并将参数映射到灯具的返回类型。但是,原生协程夹具

@pytest.fixture
async def phrase():
    return 'hello world'

Coroutine[Any, Any, str],目前,Pycharm并未将测试参数映射到其返回类型(已使用Pycharm CE 2019.1进行了测试)。因此,您有两种可能性:

设置显式类型提示

因为您知道协程应该返回什么,所以设置return和arg类型,Pycharm将停止猜测。这是最简单,最可靠的方法:

@pytest.fixture
async def phrase() -> str:
    return 'hello world'


@pytest.fixture
async def replaced(phrase: str) -> str:
    return phrase.replace('hello', 'goodbye')

切换到基于生成器的协同程序夹具

这意味着yield而不是我在评论中建议的return;但是,由您决定是否应该更改显然正确的代码以解决Pycharm的问题。