【问题标题】:Using default uuid value in Python dataclasses在 Python 数据类中使用默认 uuid 值
【发布时间】:2021-03-13 06:29:11
【问题描述】:

如果我执行以下操作:

@dataclass
class Test:
    hi: Optional[str] = field(
        default_factory=lambda: str(uuid.uuid1()))

@dataclass
class Test2:
    hi: Optional[str] = str(uuid.uuid1())

if __name__ == "__main__":
    a = Test() # Test(hi='115a865c-33be-11eb-94a1-34c93db23648')
    b = Test() # Test(hi='115a865d-33be-11eb-8c6f-34c93db23648')
    c = Test2() # Test2(hi='10e44300-33be-11eb-85eb-34c93db23648')
    d = Test2() # Test2(hi='10e44300-33be-11eb-85eb-34c93db23648')

为什么Test 会为每个实例返回不同的uuid,而Test2 每次都会返回相同的?

另外,为什么需要default factory 而不是default

【问题讨论】:

标签: python python-dataclasses


【解决方案1】:

docs中所述

default_factory:如果提供,它必须是一个零参数可调用 当该字段需要默认值时将被调用。之中 其他用途,这可用于指定可变字段 默认值,如下所述。两者都指定是错误的 default 和 default_factory。

在你的第一个例子中

@dataclass
class Test:
    hi: Optional[str] = field(
        default_factory=lambda: str(uuid.uuid1()))

您将匿名函数传递给默认工厂。

为了让事情更简单,让我们创建一个非匿名函数。

def get_new_uuid() -> str:
    return str(uuid.uuid1())


@dataclass
class Test:
    hi: Optional[uuid.UUID] = field(default_factory=get_new_uuid)

所以Test的每个实例在初始化时都会调用get_new_uuid函数来获取新的uuid。


您的第二个示例分配了一个默认值。

@dataclass
class Test2:
    hi: Optional[str] = str(uuid.uuid1())

相当于这个

@dataclass
class Test2:
    hi: Optional[str] = field(default=str(uuid.uuid1()))

如您所见,这里使用了default 参数,而之前是default_factory。在这里,您不传递函数,而是传递值。这是一次性的。

Test 中,如果不实例化hi,您将无法访问它。 但是Test2 在导入时分配了默认值,因此您无需实例化即可访问它。类似于__init__中定义的类属性和实例属性。

【讨论】:

  • "在Test中不实例化就不能访问hi。但是Test2在导入时已经赋值默认值,所以不用实例化就可以访问。类似于初始化。”这就是我寻找的差异。谢谢!
猜你喜欢
  • 2019-07-18
  • 2017-04-27
  • 1970-01-01
  • 2021-11-19
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
相关资源
最近更新 更多