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

问题描述 投票:0回答:2

我正在尝试在 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 metaprogramming python-3.7 type-hinting
2个回答
6
投票

如果我理解正确的话,我认为你必须等到 Python 3.13。

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


-3
投票

泛型类型背后的整个思想源于静态类型语言(例如 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 

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

© www.soinside.com 2019 - 2024. All rights reserved.