【问题标题】:Python default type in class type arguments类类型参数中的 Python 默认类型
【发布时间】:2020-07-14 10:06:47
【问题描述】:

我正在尝试在 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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2012-01-21
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多