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

Mic*_*ray 11 python metaprogramming type-hinting python-3.7

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

如果未定义类型,我希望能够使用默认类型指定类类型参数。例如,我想象代码看起来像这样。

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

class FooBar:
    a: Attribute[str, str]
    b: Attribute[str]
Run Code Online (Sandbox Code Playgroud)

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

dyl*_*oll 5

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

\n

PEP 696 \xe2\x80\x93 TypeVarLikes 的默认类型 | peps.python.org

\n


alt*_*-f4 0

泛型类型背后的整个想法源于静态类型语言(例如 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)
Run Code Online (Sandbox Code Playgroud)

但是,我建议在定义代码时,尽可能具体和严格地考虑类型,并定义更好的泛型。这可以通过定义更严格的泛型/抽象类型来实现:

T = TypeVar('T')  # Can be anything
A = TypeVar('A', str, bytes)  # Must be str or bytes 
Run Code Online (Sandbox Code Playgroud)

后者将允许您保持通用性,并且对类型有更多的控制。