为Python函数的字典列表指定参数类型

为Python函数的字典列表指定参数类型,python,dictionary,types,arguments,Python,Dictionary,Types,Arguments,我有一个函数,它的参数是字典列表。我试图在函数参数中指定字典的元素类型。词典的格式如下: {'my_object':my_object, 'data':int} my_对象是一种自定义数据类型。是否有任何方法可以指定字典的类型,如以下所示: def my_function(x : list[dict[my_object, int]]): Python抱怨我如何定义类型,并给出以下错误: TypeError: 'type' object is not subscriptable 如果您询问是

我有一个函数,它的参数是字典列表。我试图在函数参数中指定字典的元素类型。词典的格式如下:

{'my_object':my_object, 'data':int}
my_对象
是一种自定义数据类型。是否有任何方法可以指定字典的类型,如以下所示:

def my_function(x : list[dict[my_object, int]]):
Python抱怨我如何定义类型,并给出以下错误:

TypeError: 'type' object is not subscriptable

如果您询问是否可以指定包含自定义对象的字典列表作为键,那么答案如下。但是,如果您希望在同一个字典中指定多个类型的对象作为键,这将不起作用

您可以在Python3.9中使用类型别名执行前者。参考文献中给出了一个例子,其中列出了dicts

下面的示例显示包含自定义对象作为键的DICT列表

from collections.abc import Sequence

class MyClass: 
    def __init__(self, arg1, arg2):
        self.attr1 = arg1 + arg2

class AnotherClass: 
    def __init__(self, arg1, arg2):
        self.attr1 = arg1 + arg2
    
seq1 = dict[MyClass, int]
seq2 = list[seq1]

def myfunc(arg1: Sequence[seq2]) -> seq2:
    for dict in arg1:
        for key, value in dict.items():
                print(key.attr1, value)

#Correct type provided.
myobj1 = MyClass('A', '1')
myobj2 = MyClass('B','2')
listdict= [{myobj1: 10, myobj2: 20}, {myobj2: 100, myobj1: 200}]
listdict
myfunc(listdict)

#Incorrect type provided.  
myobj1 = AnotherClass('A', '1')
myobj2 = AnotherClass('B','2')
listdict= [{myobj1: 10, myobj2: 20}, { myobj2: 100, myobj1: 200}]
myfunc(listdict)
        

A1 10
B2 20
B2 100
A1 200

注意:尽管如此,过梁可能无法识别有效输入。例如,mypy抱怨dict(object,int)列表不是其中的一个序列。

可能是您正在寻找的?
类型错误
消息是正确的:
列表
dict
类不可订阅。从
键入
导入后,您需要使用
列表
dict
。然而,两者都不是你想要的;正如@IainShelvington所指出的,您可能需要
键入.TypedDict
(在Python 3.8中新增)。我认为您不能像Py3.7中那样准确地说明参数
x
的类型——对于具有异构值(或键)的dict没有类型。@AFPP您对此有过很好的解决方案吗?您使用
dict
时假设所有键都是字符串,您只是列出了值类型,但您并没有指明哪些键映射到哪些类型。位置顺序不合适:您的用例真的会考虑<代码> {数据“:int”、“MyObObjult:MyObjult} /Cux>是否有不同的、不正确的类型?假设“代码> DICT < /代码>的键都是类型<代码> MyClass < /代码>;问题中的示例谈到了带有字符串键的
dict
,但每个键的值都有一个特定的类型。@Chepner,感谢您注意到这一点。如上所述更正。您没有真正修复任何问题。您只是指出OP的尝试不再是类型错误。即使在Python 3.9.OP中,它仍然不能满足OP的实际要求:“my_对象是一个自定义数据类型。有没有办法指定字典的类型,比如下面的一个:'问题是他指定了它并得到了一个'subscriptable'错误。我的回答是肯定的,有一种方法可以指定它,而不会得到可下标的错误。“字典的形式如下:{'My_object':My_object',data':int}”。无论
dict
是否支持索引表示法,他们的尝试都是错误的。