我正在尝试在 python 中使用泛型类型提示,但是我不确定我想要的行为是否可能。我已经阅读了很多类型提示文档,但找不到我要找的内容。
如果未定义类型,我希望能够使用默认类型指定类类型参数。例如,我想象代码看起来像这样。
T = TypeVar('T')
S = TypeVar('S')
class Attribute(Generic[T, S=int]):
...
class FooBar:
a: Attribute[str, str]
b: Attribute[str]
因此,在这种情况下,如果没有在类型提示中指定,类型 S 将默认为 int。我也对使用元编程来实现这一点的解决方案感到满意。
如果我理解正确的话,我认为你必须等到 Python 3.13。
泛型类型背后的整个思想源于静态类型语言(例如 Scala 或 Java),它是在定义代码时允许类型的灵活性,并防止函数不必要的过度重载(这在 Python 中是不需要的,因为它是动态的)键入的语言)。因此,定义默认或后备类型完全偏离了泛型的概念。话虽如此,我认为 Union[] 更适合回答您的问题。
如果您想将其与泛型类型结合起来(考虑到泛型背后的逻辑,这没有多大意义),您可以执行以下操作:
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
后者将允许您保持通用性,对类型有更多的控制。