在 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

常见的“无显式构造函数”库 attrdataclasses 都支持:

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).