【问题标题】:Python initialize var to None?Python将var初始化为None?
【发布时间】:2019-10-20 05:55:37
【问题描述】:

有什么区别?

myVar: myCustomClassType 

对比

myVar: myCustomClassType = None

我之所以这么问,是因为 Pycharm 检查员对后者大喊大叫:

Expected type 'myCustomClassType', got 'None' instead

我知道 None 也是一个对象,因此这个检查表明存在类型冲突。 我的问题是哪种形式更好?

【问题讨论】:

  • None 确实是一个对象(就像 Python 中的所有内容一样),但不是 myCustomClassType 实例。
  • 为什么会令人惊讶?你不妨写foo: int = "bar"
  • 什么是“更好”取决于你想要达到什么。我不知道您为什么要使用类型注释变量,然后将其绑定到另一个不兼容类型的实例。但你可能有充分的理由这样做。你有吗?
  • Goyo:初始化...?我一直喜欢初始化,但在这种情况下/上下文可能我错了。

标签: python pycharm nonetype


【解决方案1】:

仅带有注释的名称在语法上是合法的,但实际上并不创建变量。

>>> foo: int
>>> foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined

myVar 的正确类型是 Union[myCustomClassType,None] 或其等效的 Optional[myCustomClassType],以允许分配 None

from typing import Optional

myVar: Optional[myCustomClassType] = None

有点相关,如果你定义一个类似的函数

def foo(bar: int = None):
    ...

mypy 将根据分配的默认值默默地将bar 的类型“提升”为Optional[int]。不过,在变量注释的情况下,它似乎并没有做同样的事情。 PyCharm 似乎也在效仿。

【讨论】:

    【解决方案2】:

    第一个是Variable Annotation 的示例,您使用类型提示让类型检查器知道将标识符(在特定范围内)与某种类型相关联。

    两者的区别在于

    myVar: myCustomClassType 
    

    不会为myVar 分配任何值,而第二个会。如果您希望myVar 具有None 值或myCustomClassType 值,则应使用typing 模块中的Optional 泛型类型:

    from typing import Optional 
    
    myVar: Optional[myCustomClassType]
    

    如果您的变量应该只包含myCustomClassType 值,那么您应该使用第一个变体,并确保在使用之前分配一个值。

    【讨论】:

      【解决方案3】:

      你需要做的

      myVar = None
      

      没有类型注释。您可以稍后分配一个myCustomerClassType 实例。

      【讨论】:

        猜你喜欢
        • 2014-04-10
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 2019-11-03
        • 1970-01-01
        相关资源
        最近更新 更多