如何键入具有特定结构的列表提示

How to type hint a list with a particular structure

我的代码中有一个数据结构(为了 MWE)是一个列表,其中第一个元素是字符串,第二个元素是整数。例如:

foo: MyStructure = ["hello", 42].

现在,由于这个结构有一个顺序,通常我会使用一个元组来代替:

foo: Tuple[str, int] = ("hello", 42).

但我明确希望能够轻松修改结构中的元素。特别是,我希望能够设置 foo[0] = "goodbye",如果 foo 是元组,则无法设置。

键入此结构的最佳方法是什么?

(我不认为这个问题是基于意见的,因为我认为大多数开发人员更喜欢如何处理这个问题的明确理由。)

现在,我能想到的主要解决方案是不正确键入结构,而是定义我自己的结构,其真实类型在评论中列出:

# MyStructure = [str, int]
MyStructure = List[Union[str, int]]

foo: MyStructure = ["hello", 42]

有没有更好的方法?

你不需要列表或元组;你想要一个自定义 class 代表 strint 的类型级产品。数据class在这里特别有用。

from dataclasses import dataclass


@dataclass
class MyStructure:
    first: str
    second: int


foo: MyStructure = MyStructure("hello", 42)

assert foo.first == "hello"
assert foo.second = 42

如果你真的想使用整数索引访问组件,你可以在 class:

中添加一个 __getitem__ 方法
@dataclass
class MyStructure:
    first: str
    second: int

    def __getitem__(self, key) -> Union[str,int]:
        if key == 0:
            return self.first
        elif key == 1:
            return self.second
        else:
            raise IndexError(key)

此外,MyStructure 的一个实例比对应的列表使用更少的内存:

>>> foo = MyStructure("hello", 42)
>>> import sys
>>> sys.getsizeof(foo)
48
>>> sys.getsizeof(["hello", 42])
72