Coverage for src / c41811 / config / basic / sequence.py: 100%
99 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-09 01:06 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-09 01:06 +0000
1# cython: language_level = 3 # noqa: ERA001
4"""
5序列类型配置数据实现
7.. versionadded:: 0.2.0
8"""
10import operator
11from collections.abc import Iterable
12from collections.abc import Iterator
13from collections.abc import MutableSequence
14from collections.abc import Sequence
15from typing import Any
16from typing import Literal
17from typing import Self
18from typing import cast
19from typing import override
21from ._generate_operators import generate
22from ._generate_operators import operate
23from .core import BasicIndexedConfigData
24from .core import BasicSingleConfigData
25from .utils import check_read_only
28@generate
29class SequenceConfigData[D: Sequence[Any]](BasicIndexedConfigData[D], MutableSequence[Any]):
30 """
31 序列配置数据
33 .. versionadded:: 0.1.5
34 """
36 _data: D
37 data: D
39 def __init__(self, data: D | None = None):
40 """
41 :param data: 序列数据
42 :type data: D | None
43 """ # noqa: D205
44 if data is None:
45 data = [] # type: ignore[assignment]
46 super().__init__(cast(D, data))
48 @property
49 @override
50 def data_read_only(self) -> bool:
51 return not isinstance(self._data, MutableSequence)
53 @override
54 @check_read_only
55 def append(self, value: Any) -> None:
56 self._data.append(value) # type: ignore[attr-defined]
58 @override
59 @check_read_only
60 def insert(self, index: int, value: Any) -> None:
61 self._data.insert(index, value) # type: ignore[attr-defined]
63 @override
64 @check_read_only
65 def extend(self, values: Iterable[Any]) -> None:
66 self._data.extend(values) # type: ignore[attr-defined]
68 @override
69 def index(self, *args: Any) -> int:
70 return self._data.index(*args)
72 @override
73 def count(self, value: Any) -> int:
74 return self._data.count(value)
76 @override
77 @check_read_only
78 def pop(self, index: int = -1) -> Any:
79 return self._data.pop(index) # type: ignore[attr-defined]
81 @override
82 @check_read_only
83 def remove(self, value: Any) -> None:
84 self._data.remove(value) # type: ignore[attr-defined]
86 @override
87 @check_read_only
88 def clear(self) -> None:
89 self._data.clear() # type: ignore[attr-defined]
91 @override
92 @check_read_only
93 def reverse(self) -> None:
94 self._data.reverse() # type: ignore[attr-defined]
96 @override
97 def __reversed__(self) -> Iterator[D]:
98 return reversed(self._data)
100 @operate(operator.mul, operator.imul)
101 def __mul__(self, other: Any) -> Self: # type: ignore[empty-body]
102 ...
104 @operate(operator.add, operator.iadd)
105 def __add__(self, other: Any) -> Self: # type: ignore[empty-body]
106 ...
108 def __rmul__(self, other: Any) -> Self: # type: ignore[empty-body]
109 ...
111 def __radd__(self, other: Any) -> Self: # type: ignore[empty-body]
112 ...
115@generate
116class StringConfigData[D: str | bytes](BasicSingleConfigData[D]):
117 """字符/字节串配置数据"""
119 _data: D
121 def __init__(self, data: D | None = None):
122 """
123 :param data: 配置数据
124 :type data: D | None
125 """ # noqa: D205
126 if data is None:
127 data = "" # type: ignore[assignment]
128 super().__init__(cast(D, data))
130 @property
131 @override
132 def data_read_only(self) -> Literal[False]:
133 """
134 配置数据是否为只读
136 :return: 配置数据是否为只读
137 :rtype: Literal[False]
139 .. note::
140 该配置数据类始终认为配置数据非只读,使其能正确作为配置数据容器使用
141 """ # noqa: RUF002
142 return False
144 @property # type: ignore[explicit-override] # mypy抽风
145 @override
146 def data(self) -> D:
147 """
148 配置的原始数据
150 .. caution::
151 未默认做深拷贝,可能导致非预期的行为
153 .. versionchanged:: 0.3.0
154 现在是可写属性
155 """ # noqa: RUF002
156 return self._data
158 @data.setter
159 def data(self, data: D) -> None:
160 self._data = data
162 @override
163 def __format__(self, format_spec: str) -> str:
164 return self._data.__format__(format_spec)
166 @operate(operator.add, operator.iadd)
167 def __add__(self, other: Any) -> Self: # type: ignore[empty-body]
168 ...
170 @operate(operator.mul, operator.imul)
171 def __mul__(self, other: Any) -> Self: # type: ignore[empty-body]
172 ...
174 def __contains__(self, key: Any) -> bool:
175 return key in self._data
177 def __iter__(self) -> Iterator[D]:
178 return iter(cast(Iterable[D], self._data))
180 def __len__(self) -> int:
181 return len(self._data)
183 def __getitem__(self, item: Any) -> D:
184 return cast(D, self._data[item])
186 @check_read_only
187 def __setitem__(self, key: Any, value: D) -> None:
188 self._data[key] = value # type: ignore[index]
190 @check_read_only
191 def __delitem__(self, key: Any) -> None:
192 del self._data[key] # type: ignore[union-attr]
194 def __reversed__(self) -> Any: # 不支持reversed[D]语法
195 return reversed(self._data)
198__all__ = (
199 "SequenceConfigData",
200 "StringConfigData",
201)