当具有可以返回多个事物的方法时,如何让pycharm根据实际返回值提供准确的智能感知选项?
Expected type 'Union[str, Type[PyPage]]', got 'ExamplePageObject' instead
ExamplePageObject扩展了PyPage
_basic_page = ExamplePageObject()
def test_simple_page_object_launching(self):
assert start(self._basic_page).retrieve_the_text() == "Hello World"
通话:
def start(entry_point: Union[str, Type[PyPage]]) -> Union[PyleniumDriver, Type[PyPage]]:
return PyleniumDriver().maximize().goto(entry_point)
通话:
def goto(self, entry_point: Union[str, Type[PyPage]]) -> Union[PyleniumDriver, Type[PyPage]]:
url = (
PyleniumConfig().base_url + entry_point
if isinstance(entry_point, str)
else entry_point.url
)
if not url:
raise PyPageException(
"The url was empty, did your page object specify the self.url parameter?"
)
else:
self.driver.get(url)
if isinstance(entry_point, PyPage):
return entry_point
return self
根据提供的start(),它应该返回该页面的一个实例,而Pycharm应该“知道”该页面所使用的方法,这可能吗?
答案 0 :(得分:0)
通过将generics和overloads组合在一起,您可能可以使大部分工作正常进行。
(注意:这些是指向mypy文档的链接,但是所描述的行为应该与PyCharm所具有的行为大致相同。mypy和PyCharm都都遵循PEP 484类型提示语义。)
例如,如下所示:
from typing import overload, Union, Type, TypeVar
_T = TypeVar('_T', bound=PyPage)
@overload
def start(entry_point: str) -> PyleniumDriver: ...
@overload
def start(entry_point: Type[_T]) -> Type[_T]: ...
def start(entry_point: Union[str, Type[_T]]) -> Union[PyleniumDriver, Type[_T]]:
return PyleniumDriver().maximize().goto(entry_point)
重载使您可以提供一种有限模式匹配的东西-类型检查器将分析您的输入参数,找出哪个定义的重载最匹配,并选择相应的返回值。
TypeVar允许我们创建一个 generic 函数-简而言之,一旦类型检查器推断出_T
的类型应该在一个地方,它将使用该精确值在_T
出现的所有其他位置使用相同的类型。
我建议您在尝试使用这些功能之一之前,先阅读以上两个链接。我对正在发生的事情的解释还不够。