【问题标题】:How do I get Pylance to ignore the possibility of None?如何让 Pylance 忽略 None 的可能性?
【发布时间】:2021-09-27 11:31:22
【问题描述】:

我喜欢 Pylance 类型检查。

但是,如果我有一个变量var: Union[None, T],其中T 实现foo,pylance 将在以下位置抛出错误:

var.foo() 因为None 类型没有实现foo

有没有办法解决这个问题?一种告诉 Pylance 的方法“这个变量有时是 None,但在这种情况下,我 100% 确定它会被分配

【问题讨论】:

  • var: Optional[T] 工作吗?

标签: python visual-studio-code type-hinting python-typing pylance


【解决方案1】:

有很多方法可以强制类型检查器接受这一点。



  1. 使用assert

    from typing import Union
    
    def do_something(var: Union[T, None]):
        assert var is not None
        var.foo()
    

  2. 引发其他异常

    from typing import Union
    
    def do_something(var: Union[T, None]):
        if var is None:
            raise RuntimeError("NO")
        var.foo()
    

  3. 使用if 声明

    from typing import Union
    
    def do_something(var: Union[T, None]):
        if var is not None:
            var.foo()
    

  4. 使用typing.cast,该函数在运行时不执行任何操作,但会强制类型检查器接受变量属于特定类型:

    from typing import Union, cast
    
    def do_something(var: Union[T, None]):
        var = cast(T, var)
        var.foo()
    

  5. 关闭该行的类型检查器

    from typing import Union
    
    def do_something(var: Union[T, None]):
        var.foo()  # type: ignore
    


还要注意,虽然类型检查器如何解释类​​型注释没有区别(两者在语义上相同),但您也可以将 typing.Union[T, None] 写为 typing.Optional[T],这可以说是稍微好一点的语法. In Python >=3.10(或者更早,如果您的代码顶部有 from __future__ import annotations),您甚至可以使用 | 运算符编写 Union 类型,即 T | None

【讨论】:

  • @George 我回滚了您的编辑,因为Optional[T] 在语义上与Union[T, None] 相同。虽然我同意它是更好的语法,但它应该对类型检查器如何解释注释没有影响。
  • 你介意让它进来吗?我知道它是一样的,但我认为语法更好,这是我最终在我的代码库中使用的。我想这个问题无论如何都不是那么受欢迎,所以最终由你决定。
  • @George 在将var 注释为Optional[T] 类型之后使用var.foo() 不会抱怨吗? Mypy 确实如此,因此它不是对所有类型检查器都通用的解决方案:/ 例如mypy-play.net/…
  • 我在底部添加了一个关于语法选项的段落:)
  • @George 我刚刚在 Pylance 上测试了链接的 sn-p,即使类型检查设置为“基本”而不是“严格”(应该如此),它在 Pylance 上也失败了。所以我看不出将它写成Optional[T] 是如何解决您在问题中提出的问题的方法:) gist.github.com/AlexWaygood/f9ae35eb43418a2e674826db516dc654
猜你喜欢
  • 2022-08-19
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多