Какая должна быть аннотация на self?

Какая должна быть аннотация на Self, пример:

class MyClass:
    def __init__(self, a):
         self.a = a

Ответы (1 шт):

Автор решения: insolor

Параметру self никакая аннотация не нужна, цитата из PEP 484 (Annotating instance and class methods):

In most cases the first argument of class and instance methods does not need to be annotated, and it is assumed to have the type of the containing class for instance methods, and a type object type corresponding to the containing class object for class methods.

Примерный перевод:

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

Для контекста - методы класса, это методы с декоратором @classmethod, они могут вызываться без создания объекта, первый параметр у них традиционно называется cls, и в него попадает не объект класса (как в параметр self), а сам класс.

Если перефразировать цитату выше "по-человечески" - то аннотация типа для аргументов self или cls не нужна, т.к. тип этих аргументов и так всегда очевиден и понятен, и человеку, и линтеру. Вы, конечно, можете это сделать, но никакой дополнительной полезной информации это не добавит.

Если вы добавите аннотацию Self - это будет что-то типа мемного джавового Car car = new Car();, это уж точно никакой дополнительной информации не добавит, ни для человека, читающего код, ни для линтеров.

Для чего нужна аннотация Self - для указания возвращаемого значения для методов, возвращающих сам объект (пример из документации):

from typing import Self


class Shape:
    def set_scale(self, scale: float) -> Self:
        self.scale = scale
        return self
→ Ссылка