python 带类型变量的界限

2mbi3lxu  于 2023-03-16  发布在  Python
关注(0)|答案(2)|浏览(110)

我想确保输入与输出相同,我尝试使用TypeVar来绑定类型,但我无法让它工作...

from typing import TypeVar, Union, Any
import pandas as pd

class my_Class():
    def __init__(self):
        self.days = []
        self.count = 0

    def __call__(self, 
                 input: Union[dict, list[dict]], 
                 *args, 
                 **kwargs
                 ) -> Union[dict, list[dict]]:
        "some code"

我尝试过的:

from typing import TypeVar, Union, Any
import pandas as pd

T = TypeVar("T", bound=Union[dict, list[dict]])

class my_Class():
    def __init__(self):
        self.days = []
        self.count = 0
    def __call__(self, input: T, *args, **kwargs) -> T:
        "some code"

它说它期待T,得到的不是Dict就是List,但是我想既然我给它定了界,它会查看我在T中定义的并集,有人能告诉我哪里做错了吗?

pgpifvop

pgpifvop1#

您需要一个 constrained 类型变量,而不是绑定类型变量,以便要求在两种情况下将同一类型绑定到T

from typing import TypeVar

T = TypeVar('T', pd.DataFrame, dict, list[dict])

class MyClass:
    def __init__(self):
        self.days = []
        self.count = 0

    def __call__(self, input: T, *args, **kwargs) -> T:
        ...

使用联合绑定,参数和返回类型都被限制为三个给定类型中的一个,但是T的每次使用都可以独立于另一个绑定。此外,静态地说,您不知道将返回三个类型中的 * 哪一个 *。使用约束类型变量,在对__call__的单个调用内的每次出现中,相同的类型必须被绑定到T
下面是一个简单的例子:

from typing import Generic, TypeVar

T = TypeVar('T', int, str)

class Foo:
    def __call__(self, x: T) -> T:
        return x

x: int = Foo()(9)  # OK, 9 makes return value int
y: str = Foo()("foo")  # OK, "foo" makes return value str
z: float = Foo()(3.14)  # Fails, 3.14 not an int or str
w: str = Foo()(9)  # Fails, can' assign an int to w
s3fp2yjn

s3fp2yjn2#

问题可能是您使用的是list而不是List,以及dict而不是Dict;尝试从typing导入它们。

from typing import TypeVar, Union, Any, Dict, List
import pandas as pd

T = TypeVar("T", bound=Union[pd.DataFrame, Dict[Any, Any], List[Dict[Any, Any]]])

class my_Class():
    def __init__(self):
        self.days = []
        self.count = 0
    def __call__(self, input: T, *args, **kwargs) -> T:
        "some code"

相关问题