Python: неизвестная подсказка типа не вызывает исключение при импорте __future__ - PullRequest
1 голос
/ 17 апреля 2019

Все классы должны быть определены, прежде чем они могут быть использованы в качестве подсказки типа. Чтобы обойти это в некоторых сценариях, рекомендуется __future__ import . Вот почему следующий код работает нормально (в Python 3.7):

from __future__ import annotations


class Person:
    def get_relative(name: str) -> Person:
        ...

Без импорта __future__ получится NameError. Но этот код тоже работает нормально:

from __future__ import annotations


class Person:
    def get_relative(name: BlahBlahTypoWhatever) -> Person:
        ...

Я ожидал что-то вроде NameError: name 'BlahBlahTypoWhatever' is not defined. Это ожидаемое поведение?

1 Ответ

2 голосов
/ 17 апреля 2019

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

Будущее annotations просто неявно меняет все аннотации на строки, т.е. это эквивалентно:

from __future__ import annotations

def foo(bar: Baz): pass
def foo(bar: 'Baz'): pass

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

...