如何键入具有特定结构的列表提示
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 代表 str
和 int
的类型级产品。数据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
我的代码中有一个数据结构(为了 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 代表 str
和 int
的类型级产品。数据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