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Сообщить о неточности