【问题标题】:Specifying Argument Type For List of Dictionary For a Python Function为 Python 函数的字典列表指定参数类型
【发布时间】:2020-11-09 06:58:05
【问题描述】:

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

{'my_object':my_object, 'data':int}

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

def my_function(x : list[dict[my_object, int]]):

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

TypeError: 'type' object is not subscriptable

【问题讨论】:

  • typing.TypedDict 可能是您想要的?
  • TypeError 消息为真:listdict 类不可下标。从 typing 导入它们后,您需要使用 ListDict。但是,两者都不是您想要的。正如@IainShelvington 指出的那样,您可能想要typing.TypedDict(Python 3.8 中的新功能)。我不认为你可以在 Py3.7 中准确地说明参数 x 的类型——对于具有异构值(或键)的字典没有类型。
  • @AFPP 你有没有得到很好的解决方案?
  • 您对dict 的使用假设所有键都是字符串,并且您只是列出了 value 类型,但您不是指示哪些键映射到哪些类型。位置顺序不合适:您的用例是否真的认为 {'data': int, "my_object": my_object} 具有不同的不正确类型?

标签: python dictionary types arguments


【解决方案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

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

【讨论】:

  • 这里假设dict的键都是MyClass的类型;问题中的示例讨论了带有字符串键的dict,但每个键的 value 都有特定的类型。
  • @Chepner,感谢您注意到这一点。如上更正。
  • 你并没有真正解决任何问题。您只是指出 OP 的尝试不再是类型错误。即使在 Python 3.9 中,它仍然没有执行 OP 实际要求的操作。
  • OP: 'my_object 是自定义数据类型。有没有办法指定字典的类型,如下所示:'问题是他指定了它并得到一个'subscriptable'错误。我的回答表明是的,有一种方法可以指定它而不会出现可下标的错误。
  • "字典的格式如下:{'my_object':my_object, 'data':int}"。无论dict 是否支持索引符号,他们的尝试都是错误的。
【解决方案2】:

你可以试试这个:

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'))

希望对你有用。

【讨论】:

    猜你喜欢
    • 2020-07-12
    • 2011-02-12
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2022-01-23
    • 2019-03-22
    • 2019-03-02
    • 1970-01-01
    相关资源
    最近更新 更多