包含类型的类型提示字典

问题描述 投票:0回答:1

我正在尝试在 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 的任何地方尝试此类型提示一样。还有其他类型提示类型的方法吗?

python typing
1个回答
0
投票

问题是你的类型注释:

dict[str,type(MyBaseClass)]

type(MyBaseClass)
type
,这不是您想要的。只需使用类型本身:

dict[str, MyBaseClass]
© www.soinside.com 2019 - 2024. All rights reserved.