【问题标题】:What type hint to specify when a function returns either an object of a certain type or None?当函数返回某种类型的对象或 None 时指定什么类型提示?
【发布时间】:2021-04-28 06:05:57
【问题描述】:

自从我在 Python 中发现类型提示后,我就开始使用它们,因为我认为它们对代码的读者很有用。我期待这些类型提示在未来最终会成为类型静态检查器,因为它会使代码更加可靠,这对于一个严肃的项目来说非常重要。

除此之外,我还有很多函数的返回类型可以是BSTNodeNone。例如,它可以是None,因为在搜索函数中,如果没有找到BSTNode,则简单地返回None。有没有办法指定返回类型也可以是None

目前我正在使用如下的东西

def search(self, x) -> BSTNode:
    pass

我知道我可以使用字符串作为类型提示,但我不确定这是正确还是最好的方法。

def search(self, x) -> "BSTNode | None":
    pass

【问题讨论】:

    标签: python-3.x return-type type-hinting


    【解决方案1】:

    在 Python 3.10 之前的版本中,管道在字符串类型提示中没有任何特殊含义。在 Python ≤ 3.9 中,我会坚持使用 PEP 0484 documents 的联合类型:

    要么

    from typing import Union
    
    def search(self, x) -> Union[BSTNode, None]:
        pass
    

    或者,更简洁的but equivalent

    from typing import Optional
    
    def search(self, x) -> Optional[BSTNode]:
        pass
    

    在 Python ≥ 3.10 中,您确实可以使用 | 来构建类型联合的表示,即使没有引号。详情请参阅Jean Monet's answerPEP 604 -- Allow writing union types as X | YWhat’s New In Python 3.10the Python 3.10 documentation of the new types.Union type

    【讨论】:

    • 好的,也感谢您指向文档。然而,我需要在每个模块中导入 UnionOptional 的事实是一个骗局。老实说,我也使用类型提示只是因为它们显然是语言核心的一部分(Python 3.5)。
    • 这就是 Python 标准库的本质。它的大部分内容都是命名空间的。并且有充分的理由。 “命名空间是一个很棒的主意——让我们做更多这样的事!”
    • 命名空间在很多情况下都很好,但我希望这个功能成为语言核心的一部分......
    • 有点像。但这是一个相当最近的功能,因此用户代码已经定义名称UnionOptional 的可能性不可忽略,必须加以考虑。
    • 我更新了我的答案以反映 Python 3.10 的变化,它为联合类型引入了这个特性/语法。
    【解决方案2】:

    感谢PEP 604,可以使用管道| 表示法,相当于Union

    def func() -> int | None:
        ...
    my_var: int | None = None
    
    # same as
    
    from typing import Optional, Union
    
    def func() -> Optional[int]:
        ...
    def func() -> Union[int, None]:
        ...
    my_var: Optional[int] = None
    my_var: Union[int, None] = None
    

    该功能是在 Python 3.10 中引入的,但您可以通过在文件开头导入注释来开始在 Python 3.8 和 3.9(不确定是否适用于 3.7?)中使用它:

    from __future__ import annotations
    

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      相关资源
      最近更新 更多