如果函数仅提示父类,则将返回值的类型提示缩小到子类

问题描述 投票:0回答:1

我有一个外部函数,它像工厂一样工作,并返回具有公共父类型的不同类的实例: 例如

class Printer:
    def make(self, blueprint:str) -> Blueprint: ...

class PrintA(Blueprint): 
     def a_specific(self) -> int: ...
class PrintB(Blueprint): ...
     def b_specific(self, args):
         """docstring"""

a : PrintA = Printer().make("A")
b : PrintB = Printer().make("B")
# TypeHint: "(variable) a: Blueprint"
# TypeHint: "(variable) b: Blueprint"

# Usage:
result = a.a_specific() # function & type of result not detected : Any
b.b_specific(arg) # function not detected, parameters and description unknown : Any

问题在于

a
b
Blueprint
作为给定的类型提示。 如何强制变量使用正确的类型提示,以便我的 IDE 可以检测到子函数?


我尝试使用

# type: ignore[override]
,但这似乎不适用于此目的,因为它没有错误;是否有另一个神奇的注释命令表明类型检查器应该信任人工注释?


注意:我无法调整打印机或蓝图本身。修改匹配的

*.pyi
文件是可能的,但应该最少。 蓝图量很大。

不确定是否相关,但使用 VS-Code 和 Python 扩展进行类型提示。

python python-3.x mypy type-hinting python-3.10
1个回答
1
投票

帮助静态类型检查器的一种可能方法是使用

typing.cast
:

进行类型转换
from typing import cast

a = cast(PrintA, Printer().make("A"))
b = cast(PrintB, Printer().make("B"))

IDE 和静态类型检查器现在应该可以正确识别

a
b

与断言不同,没有运行时检查来确保转换准确,所以要小心。

© www.soinside.com 2019 - 2024. All rights reserved.