类类型参数中的Python默认类型



我试图在python中使用泛型类型提示,但我不确定我想要的行为是否可能。我已经阅读了很多类型提示文档,但找不到我想要的内容。

如果类型没有定义,我希望能够用默认类型指定类类型参数。例如,我想代码会是这样的。

T = TypeVar('T')
S = TypeVar('S')
class Attribute(Generic[T, S=int]):
...
class FooBar:
a: Attribute[str, str]
b: Attribute[str]

因此,在这种情况下,如果没有在类型提示中指定类型S,则类型S将默认为int。我也对一个使用元编程实现这一点的解决方案感到满意。

如果我理解正确的话,我想你必须等到Python 3.12。

PEP 696–TypeVarLikes的类型默认值|peps.python.org

泛型类型背后的整个思想源于静态类型语言(如Scala或Java(,它在定义代码时允许类型的灵活性,并防止函数不必要的过度重载(Python是一种动态类型语言,这是不需要的(。因此,定义默认类型或回退类型完全偏离了泛型的概念。话虽如此,我认为工会更适合回答你的问题。

如果您想将其与泛型类型相结合(考虑到泛型背后的逻辑,这没有多大意义(,您可以执行以下操作:

from typing import Union, TypeVar
T = TypeVar('T')

def foo(var: Union[T, str]):
if var:
return "boo"

res = foo("bar")
print(res)

然而,我建议在定义代码时,尽可能对类型进行具体和严格的定义,并定义更好的泛型。这可以通过定义更严格的泛型/抽象类型来实现:

T = TypeVar('T')  # Can be anything
A = TypeVar('A', str, bytes)  # Must be str or bytes 

后者将允许您保持泛型,对您的类型有稍微更多的控制。

最新更新