Рекурсивный ввод в Python 3.5+

В Python 3.5 добавлены аннотации типов (см. Здесь ).

Есть ли способ определения рекурсивных аннотаций типа, например, для древовидной структуры?

class Employee(object): def __init__(self, name: str, reports: List[Employee]): self.name = name self.reports = reports 

В приведенном выше примере не похоже, что работает аннотационный List[Employee] . Результатом этой ошибки является запуск кода:

NameError: name 'Employee' is not defined

One Solution collect form web for “Рекурсивный ввод в Python 3.5+”

Вы можете использовать прямые ссылки, как определено в PEP 484

Ситуация, в которой это обычно происходит, – это определение класса контейнера, где определяемый класс встречается в сигнатуре некоторых методов. Например, следующий код (начало простой реализации двоичного дерева) не работает:

 class Tree: def __init__(self, left: Tree, right: Tree): self.left = left self.right = right 

Чтобы решить эту проблему, мы пишем:

 class Tree: def __init__(self, left: 'Tree', right: 'Tree'): self.left = left self.right = right 

Допустимо использовать строковые литералы как часть подсказки типа, например:

 class Tree: ... def leaves(self) -> List['Tree']: 
  • Использовать «байт-подобный объект» из urlopen.read с JSON?
  • Объект Python unittest.TestCase не имеет атрибута 'runTest'
  • Как получить IPython Notebook для запуска Python 3?
  • Ошибка Python3: «Ошибка импорта: нет имени модуля urllib2»
  • Почему отсортированный список больше, чем несортированный список
  • Ошибка при скрещивании Python для ARM
  • python3: привязать метод к экземпляру класса с .__ get __ (), он работает, но почему?
  • OrderedDict в python 3 - как получить ключи в порядке?
  • Python - лучший язык программирования в мире.