如何使pyx成为X的子类?

2024-09-24 02:21:18 发布

您现在位置:Python中文网/ 问答频道 /正文

当有一个方法可以返回多个东西时,如何让pycharm根据实际返回值提供准确的intellisense选项?你知道吗

Expected type 'Union[str, Type[PyPage]]', got 'ExamplePageObject' instead

示例PageObject扩展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应该“知道”该页所包含的方法,这可能吗?你知道吗


Tags: 方法selfurlreturnifdeftypepage
1条回答
网友
1楼 · 发布于 2024-09-24 02:21:18

通过将genericsoverloads组合在一起,您可能会得到一些基本上有效的东西。你知道吗

(注意:这些是指向mypy文档的链接,但是所描述的行为应该或多或少与PyCharm的行为相同。mypy和PyCharm都非常尊重pep484类型暗示语义。)

例如,类似这样的情况:

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允许我们创建一个泛型函数简而言之,一旦类型检查器推断出_T的类型应该在一个地方,它将在_T出现的所有其他地方使用完全相同的类型。你知道吗

我建议您在尝试使用这些功能之前先阅读上面的两个链接。我对所发生的事情的解释还不够充分。你知道吗

相关问题 更多 >