В Python 4.0 аннотации типов, такие как
foo:int
, будут обрабатываться как строка и должны быть динамически разрешены. Это можно выбрать с помощью python 3.7, используя from __future import annotations
. Функция typing.get_type_hints
попытается превратить строковые аннотации и другие прямые ссылки в фактические типы.
Мне нужна немного другая семантика, чем typing.get_type_hints
, потому что я хотел бы обрабатывать наследование классов по-другому, хотя это выглядит при рассмотрении кода типа get_type_hints
в любом случае не обрабатывает этот случай. Представьте себе следующий код:
from __future__ import annotations
def foo():
class bar: pass
def baz(a: bar): pass
return baz
, если я посмотрю на аннотации возвращаемой функции, я увижу что-то вроде
{'a': 'bar'}
Примерно то, что typing.get_type_hints
делает в этом случае, - это попытки найти словарь локальных и глобальных переменных для перехода в eval. Но как мне это сделать здесь? Как мне найти набор локальных переменных, в котором a
будет преобразовываться в класс bar
, локальный для вызова foo
, который произвел baz, который я исследую?