Имя не определено в аннотации типа

В настоящее время я работаю над созданием модуля линейной алгебры python для удовольствия и для практики с языком. Недавно я попытался добавить аннотации типа к модулю, как таковые:

class Vector:
     # Various irrelevant implementation details
     def __add__(self, other: Vector) -> Vector:
        # More implementation details....

Однако, когда я пытаюсь импортировать это, он выплевывает NameError: Name 'Vector' is not defined. Я признаю, что на этот вопрос уже был дан ответ в форме здесь, но он, похоже, не дает полного ответа на мою ситуацию.

Что я хотел бы знать:

  • Я определил класс буквально в этом файле. Почему это имя не определено?
  • Как определить Vector таким образом, чтобы его можно было использовать для аннотаций (как type)?

Ответы

Ответ 1

У вас есть форвардная декларация; функции (связанные как методы) создаются до класса, поэтому имя Vector еще не существует. Только когда все тело класса было выполнено, Python может создать объект class и привязать к нему имя Vector.

Просто используйте строку с именем:

class Vector:
     # Various irrelevant implementation details
     def __add__(self, other: 'Vector') -> 'Vector':
        # More implementation details....

Это не влияет на то, как ваша среда ID видит объявление; строки просматриваются после загрузки всего модуля и разрешаются как допустимое выражение Python в текущем контексте. Поскольку класс Vector существует после загрузки всего модуля, строка 'Vector' может быть правильно преобразована в объект класса.

Также см. спецификацию для передовых ссылок:

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

[...]

Строковый литерал должен содержать допустимое выражение Python [...], и он должен оценивать без ошибок после полной загрузки модуля.