Подсказка типа нескольких разных типов для параметра класса 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
или похожие.
Тогда я подумал о создании
AllowedActions
class в третьем файле, который просто наследуется от всех возможных классов действий. Идея для
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)
и средство проверки типов распознает подклассы как действительные