-
由 openaiops 创作于07a0fc69
id_assign.py 1.42 KiB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import os
import yaml
__all__ = ['IDAssign']
class IDAssign(object):
def __init__(self, path: str):
self._path = path
self._mapping = {'': 0} # by default let 0 == '' (a NULL item)
if os.path.isfile(path):
with open(path, 'r', encoding='utf-8') as f:
self._mapping = yaml.safe_load(f.read())
if self._mapping:
self._next_index = max(self._mapping.values()) + 1
self._rev_mapping = {v: k for k, v in self._mapping.items()}
else:
self._next_index = 0
self._rev_mapping = {}
def __len__(self):
return self._next_index
def __getitem__(self, key):
return self._mapping[key]
@property
def path(self) -> str:
return self._path
def dump_to(self, path: str):
cnt = yaml.safe_dump(self._mapping)
with open(path, 'w', encoding='utf-8') as f:
f.write(cnt)
def get_or_assign(self, key: str):
ret = self._mapping.get(key, None)
if ret is None:
self._mapping[key] = ret = self._next_index
self._rev_mapping[ret] = key
self._next_index += 1
return ret
def reverse_map(self, index: int):
return self._rev_mapping[index]
def flush(self):
self.dump_to(self._path)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.flush()