想象一下,我有一个对象,它是一个类的实例,如下所示:
@dataclass
class Foo:
bar: int
baz: str
我使用dataclasses
是为了方便,但在这个问题的上下文中,没有要求类是dataclass
.
通常,如果我想解包这样一个对象的属性,我必须实现__iter__
,例如如下:
class Foo:
...
def __iter__(self) -> Iterator[Any]:
return iter(dataclasses.astuple(self))
bar, baz = Foo(1, "qux")
但是,从像pyright这样的静态类型检查器的角度来看,我现在已经丢失了 and 的任何类型信息bar
,baz
它只能推断是 type Any
。iter
我可以通过手动创建元组参数来稍微改进:
def __iter__(self) -> Iterator[Union[str, int]]:
return iter((self.bar, self.baz))
但是我仍然没有特定的类型bar
and baz
。我可以注释bar
然后直接baz
使用dataclasses.astuple
如下:
bar: str
baz: int
bar, baz = dataclasses.astuple(Foo(1, "qux"))
但这需要可读性较差的多级列表理解,例如
bars: list[int] = [
bar for bar, _ in [dataclasses.astuple(foo) for foo in [(Foo(1, "qux"))]]
]
也把我绑在dataclasses
.
显然,这一切都不是不可克服的。如果我想使用类型检查器,我不能使用解包语法,但如果有一种干净的方法可以做到这一点,我真的很想这样做。
如果当前无法使用通用方法,则可以接受特定于dataclasses
或更好的答案。attrs