Аннотация типов в аргументах функции python3 приводит к циклическому импорту
Имеется модуль А, в котором есть класс
from b import Base
class Player(object):
def __init__(self):
pass
def get_action(self):
base.get_action()
Имеется модуль B, который на вход получает класс A
class Base(object):
@staticmethod
get_action():
....
@staticmethod
process_player(a: Player): <- из за аннотации типов, требуется в данный модуль импортировать класс Player
....
Как избавиться от циклического импорта в данном случае, и не избыточна ли данная проверка типа?
Ответы (2 шт):
Автор решения: nomnoms12
→ Ссылка
Передайте аннотацию строкой:
class Base(object):
def process_player(a: 'Player'):
pass
Автор решения: insolor
→ Ссылка
По PEP 563 начиная с Python 3.7 можно включить отложенное ("ленивое") выполнение аннотаций с помощью импорта from __future__ import annotations. Например, такой код запустится без ошибок:
from __future__ import annotations
class Base(object):
@staticmethod
def get_action():
pass
@staticmethod
def process_player(a: Player):
pass
По сути в свойстве __annotations__ для аргумента в этом случае храниться не сам класс Player, а его имя в виде строки:
print(Base.process_player.__annotations__)
выведет {'a': 'Player'}
Начиная с Python 4.0 планируется сделать это стандартным поведением.