示例:
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:phrase
在replaced
中使用时将是str
的实例,而不是Coroutine
?最好,对于每个将使用phrase
的装置,不重复代码。
答案 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的问题。