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

AFP*_*AFP 18 python dictionary types arguments

我有一个函数,其参数是字典列表。我试图在函数参数中指定字典的元素类型。该词典具有以下形式:

{'my_object':my_object, 'data':int}
Run Code Online (Sandbox Code Playgroud)

my_object是自定义数据类型。有没有办法指定字典的类型,如下所示:

def my_function(x : list[dict[my_object, int]]):
Run Code Online (Sandbox Code Playgroud)

Python 抱怨我如何定义类型并给出以下错误:

TypeError: 'type' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)

Jav*_*Gom 20

你可以试试这个:

from typing import List, Dict


def get_list_of_dicts(name: str, surname: str) -> List[Dict[str, str]]:
    return [{'name': name, 'surname': surname}]


print(get_list_of_dicts('Frank', 'Zappa'))
Run Code Online (Sandbox Code Playgroud)

我希望它对你有用。


Joh*_*rry -1

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

您可以在 Python 3.9 中使用类型别名来完成前者。参考https://docs.python.org/3/library/typing.html给出了带有字典列表的示例。

下面的示例显示了包含自定义对象作为键的字典列表。

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
Run Code Online (Sandbox Code Playgroud)

注意:Linter 可能无法识别有效的输入。例如 mypy 抱怨 dict(object, int) 列表不是其序列。