在Python数据类中创建唯一的ID

Ore*_*lom 7 python attributes attr

我的 python 数据类需要一个唯一的(无符号整数)id。这与so post非常相似,但没有明确的演员。

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)
Run Code Online (Sandbox Code Playgroud)

还有更多“pythonic”解决方案吗?

Mis*_*agi 13

使用默认工厂而不仅仅是默认工厂。这允许定义一个调用来获取每个实例化的下一个 id。
获得可累加的可调用对象的一个​​简单方法是使用count().__next__,相当于调用next(...)实例count1

常见的“无显式构造函数”库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__)
Run Code Online (Sandbox Code Playgroud)

要始终使用自动生成的值并防止将其作为参数传递,请使用init=False

@dataclass
class C:
    identifier: int = field(default_factory=count().__next__, init=False)
Run Code Online (Sandbox Code Playgroud)

1如果想避免显式寻址魔术方法,可以在count. 例如,factory=lambda counter=count(): next(counter)