3030
3131class BaseInfo :
3232 uid : int
33- _next_info_class_id : int = 0
3433 _info_classes : dict [int , type [BaseInfo ]] = {}
3534 _info_class_id : int
3635
3736 def __init_subclass__ (cls ) -> None :
38- cls ._info_class_id = BaseInfo ._next_info_class_id
39- BaseInfo ._next_info_class_id += 1
37+ if not hasattr (cls , "_info_class_id" ):
38+ raise AttributeError (f"{ cls } is missing _info_class_id." )
39+ if used_by := BaseInfo ._info_classes .get (cls ._info_class_id ):
40+ raise ValueError (
41+ f"_info_class_id { cls ._info_class_id } is already used by "
42+ f"{ used_by } "
43+ )
4044 BaseInfo ._info_classes [cls ._info_class_id ] = cls
4145
4246 def asdict (self ) -> dict [str , Any ]:
@@ -57,6 +61,7 @@ def __int__(self) -> int:
5761class ServerInfo (BaseInfo ):
5862 """A representation of a :class:`~server.Server`."""
5963
64+ _info_class_id = 0
6065 uid : int
6166 """The ipc uid of the server."""
6267 cluster_uids : list [int ]
@@ -67,6 +72,7 @@ class ServerInfo(BaseInfo):
6772class ClusterInfo (BaseInfo ):
6873 """A representation of a :class:`~cluster.Cluster`."""
6974
75+ _info_class_id = 1
7076 uid : int
7177 """The ipc uid of the cluster."""
7278 server_uid : int
@@ -99,5 +105,6 @@ def get_cluster_id(shard_id: int, shards_per_cluster: int) -> int:
99105
100106@dataclass
101107class BrainInfo (BaseInfo ):
108+ _info_class_id = 2
102109 uid : int
103110 """The ipc uid of the brain."""
0 commit comments