为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
是否支持索引表示法,他们的尝试都是错误的。