gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:01:23 27 4
gpt4 key购买 nike

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

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

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(和标准类型提示)在静态代码分析期间显示错误:“未解析的属性引用”@ idx.sum_mul_data()

现在显然这是因为 pycharm 认为函数的返回类型是“BaseClass”——而不是子类。那么我该如何声明:“返回与输入相同的类型”?

我尝试使用类型变量:T = TypeVar("T", BaseClass) ,尽管这给出了一个实际错误,但不能在 TypeVar 中使用单个约束.有趣的是使用 T = TypeVar("T", BaseClass, ChildClass)确实有效,pycharm 正确推断出 sum_div_data 的类型(提示)。

最佳答案

您应该使用具有上限的类型变量:执行 T = TypeVar('T', bound=BaseClass) 而不是 T = TypeVar('T', BaseClass).

详细信息:

  • 当您执行类似T = TypeVar('T', ClassA, ClassB, ClassC...) 的操作时,您正在创建一个 type variable with a value restriction .也就是说,您坚持 T 必须恰好是您列出的类之一。

    这就是为什么 T = TypeVar('T', ClassA) 被禁止的原因:typevar 只能等于一个类,所以你最好使用 ClassA 直接输入。

  • 当您执行类似T = TypeVar('T', bound=ClassA) 的操作时,您正在创建一个 type variable with an upper bound .您坚持 T 必须是 ClassA 或其任何子类。

关于python类型提示,返回与输入相同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46222193/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com