Аннотация типов в аргументах функции 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 планируется сделать это стандартным поведением.

→ Ссылка