在 python 数据类中创建唯一 ID
Creating a unique id in a python dataclass
我的 python 数据 class 需要一个唯一的(无符号整型)ID。这与 非常相似,但是没有 明确的 ctors。
import attr
from attrs import field
from itertools import count
@attr.s(auto_attribs=True)
class Person:
#: each Person has a unique id
_counter: count[int] = field(init=False, default=count())
_unique_id: int = field(init=False)
@_unique_id.default
def _initialize_unique_id(self) -> int:
return next(self._counter)
还有没有-pythonic”的解决方案?
Use a default factory instead of just a default. 这允许定义调用以在每个实例化时获取下一个 id。
获得可调用的一个简单方法是使用 count().__next__
,相当于在 count
实例上调用 next(...)
。1
常见的“无显式构造函数”库 attr
和 dataclasses
都支持:
from itertools import count
from dataclasses import dataclass, field
@dataclass
class C:
identifier: int = field(default_factory=count().__next__)
import attr
@attr.s
class C:
identifier: int = attr.field(factory=count().__next__)
要始终使用自动生成的值并防止将一个值作为参数传入,请使用 init=False
。
@dataclass
class C:
identifier: int = field(default_factory=count().__next__, init=False)
1 如果想避免显式寻址魔法方法,可以在 count
上使用闭包。例如,factory=lambda counter=count(): next(counter)
.
我的 python 数据 class 需要一个唯一的(无符号整型)ID。这与
import attr
from attrs import field
from itertools import count
@attr.s(auto_attribs=True)
class Person:
#: each Person has a unique id
_counter: count[int] = field(init=False, default=count())
_unique_id: int = field(init=False)
@_unique_id.default
def _initialize_unique_id(self) -> int:
return next(self._counter)
还有没有-pythonic”的解决方案?
Use a default factory instead of just a default. 这允许定义调用以在每个实例化时获取下一个 id。
获得可调用的一个简单方法是使用 count().__next__
,相当于在 count
实例上调用 next(...)
。1
常见的“无显式构造函数”库 attr
和 dataclasses
都支持:
from itertools import count
from dataclasses import dataclass, field
@dataclass
class C:
identifier: int = field(default_factory=count().__next__)
import attr
@attr.s
class C:
identifier: int = attr.field(factory=count().__next__)
要始终使用自动生成的值并防止将一个值作为参数传入,请使用 init=False
。
@dataclass
class C:
identifier: int = field(default_factory=count().__next__, init=False)
1 如果想避免显式寻址魔法方法,可以在 count
上使用闭包。例如,factory=lambda counter=count(): next(counter)
.