Python将var初始化为无?

时间:2019-06-04 16:58:59

标签: python pycharm nonetype

有什么区别?

myVar: myCustomClassType 

vs。

myVar: myCustomClassType = None

我问是因为Pycharm检查员尖叫着后者:

Expected type 'myCustomClassType', got 'None' instead

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

3 个答案:

答案 0 :(得分:3)

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

>>> 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似乎也效仿。

答案 1 :(得分:2)

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

两者之间的区别在于

myVar: myCustomClassType 

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

from typing import Optional 

myVar: Optional[myCustomClassType]

如果您的变量仅应包含myCustomClassType值,则应使用第一个变量,并确保在使用前分配一个值。

答案 2 :(得分:1)

您需要做

.bin

,不带类型注释。您可以稍后分配一个load_word2vec_format()实例。