__init __ (self) -> Nenhum: vs __init __ (self): em python [duplicado]

Sep 25 2020

Qual é a diferença entre 1) __init__(self) -> None:e 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)

Respostas

radzak Sep 25 2020 at 21:57

A -> Noneparte é uma dica de tipo. Ele foi introduzido no PEP 484. Você pode ler mais sobre ele aqui . Ambos os __init__métodos que você mostrou são equivalentes no tempo de execução. As dicas de tipo podem ser usadas por verificadores de tipo, como mypy ou Pyright .

Esta mypydocumentação resume tudo perfeitamente:

Como mypy é um analisador estático ou uma ferramenta semelhante a um lint, as anotações de tipo são apenas dicas para mypy e não interferem na execução do programa. Você executa seu programa com um interpretador Python padrão e as anotações são tratadas efetivamente como comentários.

Esta também é uma parte interessante do PEP 484 que explica a lógica por trás da implementação -> Nonedo __init__método.

(Observe que o tipo de retorno de init deve ser anotado com -> Nenhum. A razão para isso é sutil. Se init assumiu uma anotação de retorno de -> Nenhum, isso significaria que um método init sem argumento e não anotado deveria ainda tem verificação de tipo? Em vez de deixar isso ambíguo ou introduzir uma exceção para a exceção, simplesmente dizemos que init deve ter uma anotação de retorno; o comportamento padrão é, portanto, o mesmo que para outros métodos.)