簡體   English   中英

Python 類型:根據輸入的 func 參數使 python func 返回值類型

[英]Python Typing: Make python func return value type based on input func arguments

我有一個 func,它形成了某些類實例的列表,所以可以說它的輸出類型是list[SomeClass]

輸出類類型可能因數據而異(因此它可能是list[ClassA]list[ClassB]list[ClassC]等)。

我試圖將該列表傳遞給另一個類,並將 lambda 函數作為參數。 后一個類的目的是根據該 lambda 函數將其列表參數划分為兩個單獨的列表。 所以基本上我需要的是:

def func_A(cls_instance: some_cls) -> list[some_cls]:
   .....
   .....
   return list[some_cls]

class DividerClass()
    def __init__(list_of_classes: list[Object], func: Callable):
        self.list_of_classes = list_of_classes
        self.result_list_1 = []
        self.result_list_2 = []
    
    
    def divide():
        for item in self.list_of_classes:
            if func(item):
                self.result_list_1.append(item)
            else:
                self.result_list_2.append(item)
        return self.result_list_1, self.result_list_2

if __name__ == '__main__':
    list_1 = func_A(SomeClass()) -> list[SomeClass]
    list_2 = func_A(YetAnotherClass()) -> list[YetAnotherClass]
    result_1_a, result_1_b = DividerClass(list_1, lambda_func).divide() -> tuple[list[SomeClass],list[SomeClass]]
    resule_2_a, result_2_b = DividerClass(list_2, lambda_func).divide() -> tuple[list[YetAnotherClass],list[YetAnotherClass]]

但不是得到像這樣的輸出:

-> tuple[list[SomeClass],list[SomeClass]]
-> tuple[list[YetAnotherClass],list[YetAnotherClass]]

我有這樣的輸出:

-> tuple[list, list]
-> tuple[list, list]

所以問題是如何讓編譯器/IDE 知道列表中類的類型並根據輸入參數輸出 classList 類型?

使用typing.Generic指定將在各種簽名中使用任意但固定的類型。

就像是

from typing import TypeVar, Tuple, Generic


T = TypeVar('T')

def func_A(cls_instance: T) -> list[T]:
   ...


class DividerClass(Generic[T])
    def __init__(self, list_of_classes: list[T], func: Callable[[T],list[T]]):
        self.list_of_classes = list_of_classes
        self.result_list_1 = []
        self.result_list_2 = []
        self.func = func
    
    def divide(self) -> Tuple[list[T], list[T]]:
        for item in self.list_of_classes:
            if func(item):
                self.result_list_1.append(item)
            else:
                self.result_list_2.append(item)
        return self.result_list_1, self.result_list_2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM