繁体   English   中英

python类型提示,返回与输入相同的类型

[英]python type hint, return same type as input

好吧,我正在考虑一个案例,我有一个基类与(几个)孩子。 我有一个函数,它接受一个基类对象列表,并返回一个包含这些对象的新列表。

现在,如果我显然使用子类,则返回是这些子类对象的列表:请考虑以下简单的情况:

from typing import Sequence, List, TypeVar


class BaseClass:
    def __init__(self, data=None, *args, **kwargs):
        super().__init__()
        self.CanCalculate = True
        if data is None:
            data = []
            self.CanCalculate = False
        self._mydata = list(data)
        self.multiplier = 1

    @property
    def data(self):
        return self._mydata


class ChildClass(BaseClass):
    def sum_mul_data(self):
        return self.multiplier * sum(self.data)


class SecondChildClass(BaseClass):
    def sum_div_data(self):
        return sum(self.data) / self.multiplier


def myFun(input: Sequence[BaseClass]) -> List[BaseClass]:
    out = []
    for n, i in enumerate(input):
        if i.CanCalculate:
            i.multiplier = 10**n
            out.append(i)
    return out


childs = [ChildClass([1,2,3,4]), ChildClass(), ChildClass([1,2,3,4])]

t = myFun(childs)
for idx in t:
    print(idx.sum_mul_data())


childs = [SecondChildClass([1,2,3,4]), SecondChildClass(), SecondChildClass([1,2,3,4])]

t = myFun(childs)
for idx in t:
    print(idx.sum_div_data())

法律代码:但是pycharm(和标准类型提示)在静态代码分析期间显示错误:“unresolved attribute reference”@ idx.sum_mul_data()

现在显然这是由于pycharm认为函数的返回类型为“BaseClass” - 而不是孩子。 那么我怎么说:“返回与输入相同的类型”?

我尝试使用typevar: T = TypeVar("T", BaseClass) ,虽然这给出了一个实际错误,但是在TypeVar不能使用单个TypeVar 有趣的是,使用T = TypeVar("T", BaseClass, ChildClass)确实有效,并且pycharm正确地推导出sum_div_data的类型(提示)。

你应该使用带有上限的typevars:do T = TypeVar('T', bound=BaseClass)而不是T = TypeVar('T', BaseClass)

细节:

  • 当您执行T = TypeVar('T', ClassA, ClassB, ClassC...) ,您将创建一个具有值限制类型变量 也就是说,你坚持认为T必须恰好是你列出的一个类。

    这就是不允许执行T = TypeVar('T', ClassA)原因:typevar只能等于一个类,所以你也可以直接使用ClassA类型。

  • 当您执行T = TypeVar('T', bound=ClassA) ,您将创建一个带有上限类型变量 您坚持认为T必须是ClassA或其任何子类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM