如何让pycharm识别返回X的子类?

时间:2019-04-21 14:09:40

标签: python type-hinting

当具有可以返回多个事物的方法时,如何让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应该“知道”该页面所使用的方法,这可能吗?

1 个答案:

答案 0 :(得分:0)

通过将genericsoverloads组合在一起,您可能可以使大部分工作正常进行。

(注意:这些是指向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出现的所有其他位置使用相同的类型。

我建议您在尝试使用这些功能之一之前,先阅读以上两个链接。我对正在发生的事情的解释还不够。

相关问题