我正在尝试在 python 中输入提示字典。我之前从未遇到过问题,因为我的键值对总是相当直接的。但是我现在希望输入提示一个字典来包含 [str: type(MyBaseClass)] 的键值对,其中键是某个字符串,值是我的基类的类型。
问题是我的 linting 工具和 python 解释器(我猜)是 python 3.11.6 将此字典识别为 dict[str, Any] 而不是 dict[str, type(MyBaseClass)]。我知道这不会影响我的程序的执行,但当我从字典中获取值后尝试访问 MyBaseClass 的类方法时,它会限制我。
我将显示一些代码,突出显示我的问题以及为什么它阻碍我实现目标。
感谢任何帮助,干杯!
class MyBaseClass:
def __init__(self):
pass
@classmethod
def some_method(self):
# do something
pass
class MyChildClassA(MyBaseClass)
def __init__(self):
pass
class MyChildClassB(MyBaseClass)
def __init__(self):
pass
DICTIONARY_IN_QUESTION: dict[str,type(MyBaseClass)] = {
"some_string_A" : MyChildClassA,
"some_string_B" : MyChildClassB,
}
def attempt_to_build_from_dict():
class_type_A = DICTIONARY_IN_QUESTION["some_string_A"]
class_type_A.some_method() # try to call classmethod here but interperater does not recognise it as it
# it sees class_type_A as an Any
if __name__ == "__main__":
attempt_to_build_from_dict()
如果代码格式奇怪,我很抱歉我尝试手动编写 python 代码
将鼠标悬停在 DICTIONARY_IN_QUESTION 上显示类型为 dict[str, Any] 而不是预期的 dict[str, type(MyBaseClass)]
我尝试过使用打字。类型,但我知道这只是已弃用的代码,类型的工作原理相同。我不能使用 dict[str, MyBaseClass] 因为这告诉 python 该值是 MyBaseClass 的实例,但我不希望它是这样。
此问题似乎源于 python 互操作 type(MyBaseClass) 的类型提示,就好像我在显示为 Any 的任何地方尝试此类型提示一样。还有其他类型提示类型的方法吗?
问题是你的类型注释:
dict[str,type(MyBaseClass)]
type(MyBaseClass)
是 type
,这不是您想要的。只需使用类型本身:
dict[str, MyBaseClass]