Python Glossary English

Python 3.14+annotationlibпонятие

annotationlib.Format

форматы аннотаций

Перечисление форматов, в которых можно получить ленивые аннотации: VALUE (вычислить), FORWARDREF (подставить заглушки), STRING (текст).

Синтаксис

annotationlib.Format.VALUE | Format.FORWARDREF | Format.STRING

Главная ловушка Python 3.14: аннотации больше не вычисляются при def, поэтому ссылка вперёд на ещё не объявленный класс не падает при определении, а падает NameError при первом чтении в формате VALUE (а именно его дают __annotations__ и get_annotations по умолчанию). FORWARDREF не падает: известные имена становятся настоящими объектами, неизвестные — ForwardRef. STRING ничего не вычисляет и отдаёт текст из исходника, поэтому типы оттуда нельзя сравнить с int. VALUE_WITH_FAKE_GLOBALS — служебный формат для функций __annotate__, get_annotations его отвергает с ValueError.

Примеры

# Python 3.14+
from annotationlib import get_annotations, Format
def move(p: Point) -> None: ...  # Point ещё не объявлен — и это не ошибка
try:
    get_annotations(move)  # формат VALUE по умолчанию
except NameError as e:
    print(e)  # → name 'Point' is not defined
print(get_annotations(move, format=Format.STRING))  # → {'p': 'Point', 'return': 'None'}
ref = get_annotations(move, format=Format.FORWARDREF)['p']
print(type(ref).__name__, ref.__forward_arg__)  # → ForwardRef Point
class Point: ...
print(get_annotations(move))  # → {'p': <class '__main__.Point'>, 'return': None}
# Python 3.14+
from annotationlib import Format
print([f.name for f in Format])  # → ['VALUE', 'VALUE_WITH_FAKE_GLOBALS', 'FORWARDREF', 'STRING']
print(int(Format.VALUE), int(Format.STRING))  # → 1 4

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности