Подсказка типа нескольких разных типов для параметра класса Pylance

Как лучше всего ввести подсказку, если параметр может принимать несколько (15+) разных классов?

У меня есть класс с параметром, который может выполнять множество различных типов действий. Каждое действие является производным от базового класса и реализует что-то особенное для этого дочернего класса по сравнению с его братьями и сестрами:

      # path.py
class Path:
    def __init__(self, action)       # action: Any? Union[A,B,C,...]?
        # do some init stuff here
        
# actions.py
class Action:
    def __init__(self, ...)
        # do some init stuff here

class ActionA(Action):
    def __init__(self, ...)
        # do some init stuff here

class ActionB(Action):
    def __init__(self)
        # do some init stuff here


# plenty more Action subclasses
# in fact, in the future the list will probably keep growing
...

Большинство ответов просто упоминают Union, но это имеет смысл лишь для нескольких возможных типов. Я не думаю, что мне нужно добавить огромную строку в такие параметры, как actions: Union[ClassA, ClassB, ClassC, ..., ClassZ]. В любом случае, когда я пытался, Пилэнс говорил Argument to class must be a base class и Unknown type of base class, obscuring deriving type или похожие.

Тогда я подумал о создании AllowedActionsclass в третьем файле, который просто наследуется от всех возможных классов действий. Идея для action= теперь взять в качестве обобщающего:

      class AllowedAction(ActionA, ActionB, ActionC, ..., ActionZ):
    def __init__(self):
        pass

Я бы не возражал тогда просто наброситься на Action подклассы к этому объявлению, и я мог бы просто сказать action: AllowedAction. Однако теперь, когда я создаю экземпляр и добавляю что-то в его action параметр как Path(action=ActionA()), Я понимаю Argument of type "ActionA" cannot be assigned to parameter "action" of type "AllowedAction". Очевидно, потому что дочерний класс ActionA не то же самое, что и класс для всех / дочерних детей AllowedAction но как и с.

Это заставляет меня поверить в Path Я должен просто назначить action: Any, но похоже, что это в первую очередь сводит на нет цель хинтинга типов?

Я не знаю, должен ли я решать проблему таким образом, или, может быть, я все неправильно думаю и должен реструктурировать наследование или что-то в этом роде. Любая помощь?

1 ответ

Поскольку все ваши подклассы Action наследуют от Action, вы сможете просто сделатьdef __init__(self, action:Action)и средство проверки типов распознает подклассы как действительные

Другие вопросы по тегам