Python Glossary English

Python 3.14+annotationlibфункция

annotationlib.get_annotate_from_class_namespace()

низкоуровневые вызовы

Достаёт функцию __annotate__ из словаря пространства имён класса, пока класс ещё создаётся, — например, в __new__ метакласса.

Синтаксис

annotationlib.get_annotate_from_class_namespace(namespace)

До 3.14 метакласс читал ns['__annotations__'] — готовый словарь. С 3.14 этого ключа в пространстве имён нет: компилятор кладёт туда функцию под служебным именем, и старый код молча видит «аннотаций нет» или ловит KeyError. Эта функция — переносимый способ её достать; None означает, что аннотаций в теле класса нет. Полученную функцию вызывают через call_annotate_function, иначе доступен только формат VALUE.

Примеры

# Python 3.14+
from annotationlib import get_annotate_from_class_namespace, call_annotate_function, Format
seen = {}
class Meta(type):
    def __new__(mcls, name, bases, ns):
        annotate = get_annotate_from_class_namespace(ns)
        seen[name] = annotate and call_annotate_function(annotate, Format.STRING)
        print(name, '__annotations__' in ns)  # → User False / Empty False
        return super().__new__(mcls, name, bases, ns)
class User(metaclass=Meta):
    name: str
    boss: Manager  # ссылка вперёд
class Empty(metaclass=Meta): ...
print(seen)  # → {'User': {'name': 'str', 'boss': 'Manager'}, 'Empty': None}

См. также

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