gpt4 book ai didi

python - 如果有多个可能的返回值,pyright 是否应该根据传递的参数自动推断出正确的值?

转载 作者:行者123 更新时间:2023-12-04 07:16:01 26 4
gpt4 key购买 nike

我有以下功能:

from lxml import etree
from typing import Union


def _get_inner_xml(element: Union[etree._Element, None]) -> Union[str, None]:
if element is None:
return None

# See https://stackoverflow.com/a/51124963
return (str(element.text or "") + "".join(etree.tostring(child, encoding="unicode") for child in element)).strip()


root = etree.fromstring('<html><body>TEXT<br/>TAIL</body></html>')
innerXML = _get_inner_xml(root)
print(innerXML)

我的理解是,如果我将 None 作为参数传递,我总是会得到 None 作为返回值。另一方面,作为参数的 etree._Element 将始终导致 str 返回。

如果我使用 pylance 在 vscode 中编写以下内容(它在后台使用 pyright):

def test(element: etree._Element):
variable = _get_inner_xml(element)

在这种情况下,我得到了类型提示 (variable) variable: str |无。我希望 pylance 知道变量应该是 str 类型。我在监督什么吗?这可能是一个错误吗?

如果这按预期工作:是否有可能手动告诉 pylance “每当此函数获得 etree._Element 时,它将返回 str 并且每当我通过None 它返回 None"?

最佳答案

这里的答案是使用 typing.overload(文档 here ),它允许您为一个函数注册多个不同的签名。用 @overload 装饰的函数定义在运行时会被忽略——它们只是用于类型检查器——所以函数体可以用文字省略号 ... 填充, pass, 或者只是一个文档字符串。您还需要确保提供不使用 @overload 的函数的“具体”实现。

from lxml import etree
from typing import Union, overload

@overload
def _get_inner_xml(element: etree._Element) -> str:
"""Signature when `element` is of type `etree._Element`"""

@overload
def _get_inner_xml(element: None) -> None: ...
"""Signature when `element` is of type `None`"""

def _get_inner_xml(element: Union[etree._Element, None]) -> Union[str, None]:
if element is None:
return None

# See https://stackoverflow.com/a/51124963
return (str(element.text or "") + "".join(etree.tostring(child, encoding="unicode") for child in element)).strip()


root = etree.fromstring('<html><body>TEXT<br/>TAIL</body></html>')
innerXML = _get_inner_xml(root)
print(innerXML)

关于python - 如果有多个可能的返回值,pyright 是否应该根据传递的参数自动推断出正确的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68754693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com