类属性多类型场景下,函数仅接受子集的Python类型提示方法
为函数添加针对类属性子集的类型提示
当类的属性支持多种类型,但函数仅能处理其中一部分时,可以通过以下几种方式明确类型提示:
1. 使用泛型类(推荐用于可提前规划类型参数的场景)
通过泛型让类的属性类型可参数化,函数直接指定接受特定类型参数的类实例:
import dataclasses from typing import Generic, TypeVar # 限定类型变量只能是int或str T = TypeVar('T', int, str) @dataclasses.dataclass class Foo(Generic[T]): a: T def plus_1_a(foo: Foo[int]) -> None: """仅接受a为int类型的Foo实例""" foo.a += 1
2. 创建子类(直观易懂的方案)
定义继承自原类的子类,重写属性类型为目标子集,函数接受该子类实例:
import dataclasses @dataclasses.dataclass class Foo: a: int | str @dataclasses.dataclass class FooInt(Foo): a: int # 重写属性,限定为int类型 def plus_1_a(foo: FooInt) -> None: """仅接受FooInt类型的实例(即a为int的Foo)""" foo.a += 1
3. 使用Protocol(Python 3.8+,无需修改原类的灵活方案)
定义一个协议,要求对象拥有指定类型的属性,函数接受符合该协议的对象:
import dataclasses from typing import Protocol class HasIntA(Protocol): a: int @dataclasses.dataclass class Foo: a: int | str def plus_1_a(foo: HasIntA) -> None: """仅接受拥有int类型a属性的对象""" foo.a += 1
内容的提问来源于stack exchange,提问作者Paulo Costa
相关产品推荐
相关产品推荐

