Python中解包对象属性时是否可以保留对应的静态类型信息?
解决方案
方案1:自定义带明确返回类型的元组转换方法(通用无依赖方案)
直接给类实现返回固定长度元组的方法,静态类型检查器可以准确识别元组每个位置的类型,解包时自动继承对应类型:
# Python 3.9+ 可直接用 tuple 类型标注,无需导入 typing.Tuple from typing import Tuple class Foo: def __init__(self, bar: int, baz: str): self.bar = bar self.baz = baz def to_tuple(self) -> Tuple[int, str]: return (self.bar, self.baz) # 解包时bar、baz可自动获得正确类型 bar, baz = Foo(1, "qux").to_tuple()
对应列表推导式的写法可以大幅简化,可读性更高:
foo_list = [Foo(1, "qux"), Foo(2, "corge")] bars: list[int] = [bar for bar, _ in map(Foo.to_tuple, foo_list)]
方案2:针对dataclass的适配方案
可以直接复用dataclasses.astuple能力,仅需补充方法的返回类型标注即可:
from dataclasses import dataclass, astuple from typing import Tuple @dataclass class Foo: bar: int baz: str def astuple(self) -> Tuple[int, str]: return astuple(self)
方案3:针对attrs的适配方案
attrs原生自带astuple方法,21.3.0及以上版本的类型桩已经默认支持固定长度元组的类型推断,无需额外标注即可正常识别:
import attr @attr.define class Foo: bar: int baz: str # 直接解包返回的元组即可获得正确类型 bar, baz = Foo(1, "qux").astuple()
补充说明
如果一定要使用bar, baz = foo的直接对象解包语法,目前Python的静态类型系统暂不支持为迭代器指定不同位置的独立类型,无法实现完美的类型保留,更推荐使用上述元组转换方法的方案,兼顾类型安全和代码可读性。
内容的提问来源于stack exchange,提问作者thisisrandy
相关产品推荐
相关产品推荐

