问题描述
当参数可以采用多个 (15+) 不同类时,输入提示的最佳方法是什么?
我有一个带有参数 Path
的类 action
,可以执行许多不同类型的操作。每个操作都派生自基类 Action
,并实现了与其兄弟类相比特定于该子类的某些内容:
# 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]
之类的参数上添加大行。无论如何,当我尝试时,Pylance 说的是 Argument to class must be a base class
和 UnkNown type of base class,obscuring deriving type
或类似的。
于是我想到在第三个文件中创建一个 AllowedActions
类,该文件仅从所有可能的操作类继承。这个想法是让 Path
的 action=
现在把 AllowedAction
作为一个包罗万象的:
class AllowedAction(ActionA,ActionB,ActionC,ActionZ):
def __init__(self):
pass
我不介意在此 Action
声明中添加 AllowedAction
子类,并且在 Path
中我可以只说 action: AllowedAction
。但是,现在当我实例化 Path
并向其 action
参数(如 Path(action=ActionA())
)添加一些内容时,我得到了 Argument of type "ActionA" cannot be assigned to parameter "action" of type "AllowedAction"
。显然是因为子类 ActionA
与包罗万象/子子类 AllowedAction
不一样,而是像 wth。
这让我相信 Path
我应该只分配 action: Any
,但它似乎首先违背了类型提示的全部目的?
我不知道我是否应该以这种方式解决问题,或者我认为这一切都错了,应该重组继承或其他什么。有什么帮助吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)