在 Python 数据类中使用默认 uuid 值
Using default uuid value in Python dataclasses
如果我执行以下命令:
@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
会 return 为每个实例使用不同的 uuid,而 Test2
会 return 每次都相同?
此外,为什么需要 default factory
而不是 default
?
如 docs
中所述
default_factory: If provided, it must be a zero-argument callable that
will be called when a default value is needed for this field. Among
other purposes, this can be used to specify fields with mutable
default values, as discussed below. It is an error to specify both
default and 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__
.
中定义的class属性和实例属性
如果我执行以下命令:
@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
会 return 为每个实例使用不同的 uuid,而 Test2
会 return 每次都相同?
此外,为什么需要 default factory
而不是 default
?
如 docs
中所述default_factory: If provided, it must be a zero-argument callable that will be called when a default value is needed for this field. Among other purposes, this can be used to specify fields with mutable default values, as discussed below. It is an error to specify both default and 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__
.