Python将var初始化为None?

JDO*_*own 3 python pycharm nonetype

有什么不同?

myVar: myCustomClassType 
Run Code Online (Sandbox Code Playgroud)

对比

myVar: myCustomClassType = None
Run Code Online (Sandbox Code Playgroud)

我问是因为 Pycharm 检查员对后者大喊大叫:

Expected type 'myCustomClassType', got 'None' instead
Run Code Online (Sandbox Code Playgroud)

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

che*_*ner 7

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

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

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

from typing import Optional

myVar: Optional[myCustomClassType] = None
Run Code Online (Sandbox Code Playgroud)

有点相关,如果你定义一个像这样的函数

def foo(bar: int = None):
    ...
Run Code Online (Sandbox Code Playgroud)

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


Pat*_*ugh 5

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

两者的区别在于

myVar: myCustomClassType 
Run Code Online (Sandbox Code Playgroud)

不会为 分配任何值myVar,而第二个会。如果您打算myVar拥有一个None值或一个myCustomClassType值,您应该使用模块中的Optional泛型类型typing

from typing import Optional 

myVar: Optional[myCustomClassType]
Run Code Online (Sandbox Code Playgroud)

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