__init __ (self) -> None: vs __init __ (self): в python [дубликат]

Sep 25 2020

В чем разница между 1) __init__(self) -> None:и 2) __init__(self):?

class A:
    def __init__(self) -> None:
        self.a = 5

class B:
    def __init__(self):
        self.a = 5

print (" A : ", A().a)
print (" B : ", B().a)

Ответы

radzak Sep 25 2020 at 21:57

-> NoneЧасть представляет собой тип намек. Он был представлен в PEP 484. Подробнее об этом можно прочитать здесь . Оба __init__метода, которые вы показали, эквивалентны во время выполнения. Подсказки типа могут использоваться средствами проверки типов, такими как mypy или Pyright .

Эта часть mypyдокументации прекрасно резюмирует это:

Поскольку mypy - это статический анализатор или инструмент, похожий на линт, аннотации типов являются лишь подсказками для mypy и не мешают запуску вашей программы. Вы запускаете свою программу с помощью стандартного интерпретатора Python, и аннотации эффективно обрабатываются как комментарии.

Это тоже интересный кусок PEP 484, объясняющее обоснование ввода -> Noneв __init__методе.

(Обратите внимание, что тип возвращаемого значения init должен быть аннотирован -> None. Причина этого тонкая. Если init предполагает, что возвращаемая аннотация -> None, это будет означать, что метод init без аргументов и без аннотаций должен по-прежнему проверяется тип? Вместо того, чтобы оставлять это неоднозначным или вводить исключение для исключения, мы просто говорим, что init должен иметь аннотацию возврата; поэтому поведение по умолчанию такое же, как и для других методов.)