Python инициализирует переменную None? - PullRequest
1 голос
/ 04 июня 2019

В чем разница?

myVar: myCustomClassType 

против

myVar: myCustomClassType = None

Я спрашиваю, потому что инспектор Pycharm кричит с последним:

Expected type 'myCustomClassType', got 'None' instead

Я понимаю, чтоНи один из них тоже не является объектом, и поэтому эта проверка утверждает, что существует конфликт типов.У меня вопрос, какая форма лучше?

Ответы [ 3 ]

3 голосов
/ 04 июня 2019

Имя с только аннотацией синтаксически допустимо, но фактически не создает переменную.

>>> 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 голосов
/ 04 июня 2019

Первый - это пример Аннотация переменной , где вы используете подсказки типов, чтобы дать знать контролерам типов, чтобы связать идентификатор (в определенной области) с каким-либо типом.

Разница между ними заключается в том, что

myVar: myCustomClassType 

не присваивает значение myVar, в то время как второе делает.Если вы хотите, чтобы myVar имел либо значение None, либо значение myCustomClassType, вам следует использовать универсальный тип Optional из модуля typing:

from typing import Optional 

myVar: Optional[myCustomClassType]

Если ваша переменная должна содержать только значения myCustomClassType, вам следует использовать первый вариант и обязательно назначить значение перед его использованием.

1 голос
/ 04 июня 2019

Вам нужно сделать

myVar = None

без аннотации типа.Вы можете назначить экземпляр myCustomerClassType позже.

...