dycw-utilities 0.125.9__py3-none-any.whl → 0.125.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.125.9
3
+ Version: 0.125.11
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
7
7
  Requires-Dist: typing-extensions<4.14,>=4.13.1
8
8
  Provides-Extra: test
9
- Requires-Dist: hypothesis<6.132,>=6.131.28; extra == 'test'
9
+ Requires-Dist: hypothesis<6.132,>=6.131.30; extra == 'test'
10
10
  Requires-Dist: pytest-asyncio<1.1,>=1.0.0; extra == 'test'
11
11
  Requires-Dist: pytest-cov<6.2,>=6.1.1; extra == 'test'
12
12
  Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
13
- Requires-Dist: pytest-lazy-fixtures<1.2,>=1.1.3; extra == 'test'
13
+ Requires-Dist: pytest-lazy-fixtures<1.2,>=1.1.4; extra == 'test'
14
14
  Requires-Dist: pytest-only<2.2,>=2.1.2; extra == 'test'
15
15
  Requires-Dist: pytest-randomly<3.17,>=3.16.0; extra == 'test'
16
16
  Requires-Dist: pytest-regressions<2.8,>=2.7.0; extra == 'test'
@@ -26,7 +26,7 @@ Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-altair'
26
26
  Requires-Dist: img2pdf<0.7,>=0.6.0; extra == 'zzz-test-altair'
27
27
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-altair'
28
28
  Requires-Dist: vl-convert-python<1.8,>=1.7.0; extra == 'zzz-test-altair'
29
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-altair'
29
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-altair'
30
30
  Provides-Extra: zzz-test-asyncio
31
31
  Provides-Extra: zzz-test-atomicwrites
32
32
  Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-atomicwrites'
@@ -37,7 +37,7 @@ Requires-Dist: cachetools<5.6,>=5.5.2; extra == 'zzz-test-cachetools'
37
37
  Provides-Extra: zzz-test-click
38
38
  Requires-Dist: click<8.3,>=8.2.1; extra == 'zzz-test-click'
39
39
  Requires-Dist: sqlalchemy<2.1,>=2.0.41; extra == 'zzz-test-click'
40
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-click'
40
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-click'
41
41
  Provides-Extra: zzz-test-contextlib
42
42
  Provides-Extra: zzz-test-contextvars
43
43
  Provides-Extra: zzz-test-cryptography
@@ -47,10 +47,10 @@ Requires-Dist: cvxpy<1.7,>=1.6.5; extra == 'zzz-test-cvxpy'
47
47
  Provides-Extra: zzz-test-dataclasses
48
48
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-dataclasses'
49
49
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-dataclasses'
50
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-dataclasses'
50
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-dataclasses'
51
51
  Provides-Extra: zzz-test-datetime
52
52
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-datetime'
53
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-datetime'
53
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-datetime'
54
54
  Provides-Extra: zzz-test-enum
55
55
  Provides-Extra: zzz-test-errors
56
56
  Provides-Extra: zzz-test-eventkit
@@ -69,16 +69,16 @@ Provides-Extra: zzz-test-git
69
69
  Provides-Extra: zzz-test-hashlib
70
70
  Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-hashlib'
71
71
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-hashlib'
72
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-hashlib'
72
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-hashlib'
73
73
  Provides-Extra: zzz-test-http
74
74
  Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-http'
75
75
  Requires-Dist: orjson<3.11,>=3.10.18; extra == 'zzz-test-http'
76
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-http'
76
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-http'
77
77
  Provides-Extra: zzz-test-hypothesis
78
78
  Requires-Dist: aiosqlite<0.22,>=0.21.0; extra == 'zzz-test-hypothesis'
79
79
  Requires-Dist: asyncpg<0.31,>=0.30.0; extra == 'zzz-test-hypothesis'
80
80
  Requires-Dist: greenlet<3.3,>=3.2.0; extra == 'zzz-test-hypothesis'
81
- Requires-Dist: hypothesis<6.132,>=6.131.28; extra == 'zzz-test-hypothesis'
81
+ Requires-Dist: hypothesis<6.132,>=6.131.30; extra == 'zzz-test-hypothesis'
82
82
  Requires-Dist: luigi<3.7,>=3.6.0; extra == 'zzz-test-hypothesis'
83
83
  Requires-Dist: numpy<2.3,>=2.2.6; extra == 'zzz-test-hypothesis'
84
84
  Requires-Dist: pathvalidate<3.3,>=3.2.3; extra == 'zzz-test-hypothesis'
@@ -86,12 +86,12 @@ Requires-Dist: redis<6.2,>=6.1.0; extra == 'zzz-test-hypothesis'
86
86
  Requires-Dist: sqlalchemy<2.1,>=2.0.41; extra == 'zzz-test-hypothesis'
87
87
  Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-hypothesis'
88
88
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-hypothesis'
89
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-hypothesis'
89
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-hypothesis'
90
90
  Provides-Extra: zzz-test-ipython
91
91
  Requires-Dist: ipython<9.1,>=9.0.1; extra == 'zzz-test-ipython'
92
92
  Provides-Extra: zzz-test-iterables
93
93
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-iterables'
94
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-iterables'
94
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-iterables'
95
95
  Provides-Extra: zzz-test-jupyter
96
96
  Requires-Dist: jupyterlab<4.3,>=4.2.0; extra == 'zzz-test-jupyter'
97
97
  Requires-Dist: pandas<2.3,>=2.2.2; extra == 'zzz-test-jupyter'
@@ -103,12 +103,12 @@ Requires-Dist: concurrent-log-handler<0.10,>=0.9.26; extra == 'zzz-test-logging'
103
103
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-logging'
104
104
  Requires-Dist: tomlkit<0.14,>=0.13.2; extra == 'zzz-test-logging'
105
105
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-logging'
106
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-logging'
106
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-logging'
107
107
  Provides-Extra: zzz-test-loguru
108
108
  Requires-Dist: loguru<0.8,>=0.7.3; extra == 'zzz-test-loguru'
109
109
  Provides-Extra: zzz-test-luigi
110
110
  Requires-Dist: luigi<3.7,>=3.6.0; extra == 'zzz-test-luigi'
111
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-luigi'
111
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-luigi'
112
112
  Provides-Extra: zzz-test-math
113
113
  Requires-Dist: numpy<2.3,>=2.2.6; extra == 'zzz-test-math'
114
114
  Provides-Extra: zzz-test-memory-profiler
@@ -120,7 +120,7 @@ Provides-Extra: zzz-test-numpy
120
120
  Requires-Dist: numpy<2.3,>=2.2.6; extra == 'zzz-test-numpy'
121
121
  Provides-Extra: zzz-test-operator
122
122
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-operator'
123
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-operator'
123
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-operator'
124
124
  Provides-Extra: zzz-test-optuna
125
125
  Requires-Dist: optuna<4.4,>=4.3.0; extra == 'zzz-test-optuna'
126
126
  Provides-Extra: zzz-test-orjson
@@ -128,7 +128,7 @@ Requires-Dist: orjson<3.11,>=3.10.15; extra == 'zzz-test-orjson'
128
128
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-orjson'
129
129
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-orjson'
130
130
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-orjson'
131
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-orjson'
131
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-orjson'
132
132
  Provides-Extra: zzz-test-os
133
133
  Provides-Extra: zzz-test-pathlib
134
134
  Provides-Extra: zzz-test-pickle
@@ -136,7 +136,7 @@ Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-pickle'
136
136
  Provides-Extra: zzz-test-platform
137
137
  Provides-Extra: zzz-test-polars
138
138
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-polars'
139
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-polars'
139
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-polars'
140
140
  Provides-Extra: zzz-test-pqdm
141
141
  Requires-Dist: pqdm<0.3,>=0.2.0; extra == 'zzz-test-pqdm'
142
142
  Provides-Extra: zzz-test-pydantic
@@ -151,12 +151,12 @@ Requires-Dist: pyrsistent<0.21,>=0.20.0; extra == 'zzz-test-pyrsistent'
151
151
  Provides-Extra: zzz-test-pytest
152
152
  Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-pytest'
153
153
  Requires-Dist: orjson<3.11,>=3.10.18; extra == 'zzz-test-pytest'
154
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-pytest'
154
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-pytest'
155
155
  Provides-Extra: zzz-test-pytest-regressions
156
156
  Requires-Dist: pytest-regressions<2.8,>=2.7.0; extra == 'zzz-test-pytest-regressions'
157
157
  Provides-Extra: zzz-test-python-dotenv
158
158
  Requires-Dist: python-dotenv<1.2,>=1.1.0; extra == 'zzz-test-python-dotenv'
159
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-python-dotenv'
159
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-python-dotenv'
160
160
  Provides-Extra: zzz-test-random
161
161
  Provides-Extra: zzz-test-re
162
162
  Provides-Extra: zzz-test-redis
@@ -166,7 +166,7 @@ Requires-Dist: redis<6.2,>=6.1.0; extra == 'zzz-test-redis'
166
166
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-redis'
167
167
  Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-redis'
168
168
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-redis'
169
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-redis'
169
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-redis'
170
170
  Provides-Extra: zzz-test-rich
171
171
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-rich'
172
172
  Provides-Extra: zzz-test-scipy
@@ -174,7 +174,7 @@ Requires-Dist: scipy<1.16,>=1.15.3; extra == 'zzz-test-scipy'
174
174
  Provides-Extra: zzz-test-sentinel
175
175
  Provides-Extra: zzz-test-shelve
176
176
  Provides-Extra: zzz-test-slack-sdk
177
- Requires-Dist: aiohttp<3.12.1,>=3.12.0; extra == 'zzz-test-slack-sdk'
177
+ Requires-Dist: aiohttp<3.12.3,>=3.12.2; extra == 'zzz-test-slack-sdk'
178
178
  Requires-Dist: slack-sdk<3.36,>=3.35.0; extra == 'zzz-test-slack-sdk'
179
179
  Provides-Extra: zzz-test-socket
180
180
  Provides-Extra: zzz-test-sqlalchemy
@@ -192,7 +192,7 @@ Requires-Dist: nest-asyncio<1.7,>=1.6.0; extra == 'zzz-test-sqlalchemy-polars'
192
192
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-sqlalchemy-polars'
193
193
  Requires-Dist: sqlalchemy<2.1,>=2.0.41; extra == 'zzz-test-sqlalchemy-polars'
194
194
  Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-sqlalchemy-polars'
195
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-sqlalchemy-polars'
195
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-sqlalchemy-polars'
196
196
  Provides-Extra: zzz-test-streamlit
197
197
  Requires-Dist: streamlit<1.46,>=1.45.0; extra == 'zzz-test-streamlit'
198
198
  Provides-Extra: zzz-test-sys
@@ -200,7 +200,7 @@ Requires-Dist: atomicwrites<1.5,>=1.4.1; extra == 'zzz-test-sys'
200
200
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-sys'
201
201
  Requires-Dist: tomlkit<0.14,>=0.13.2; extra == 'zzz-test-sys'
202
202
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-sys'
203
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-sys'
203
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-sys'
204
204
  Provides-Extra: zzz-test-tempfile
205
205
  Provides-Extra: zzz-test-tenacity
206
206
  Requires-Dist: tenacity<9.0,>=8.5.0; extra == 'zzz-test-tenacity'
@@ -211,11 +211,11 @@ Provides-Extra: zzz-test-traceback
211
211
  Requires-Dist: rich<14.1,>=14.0.0; extra == 'zzz-test-traceback'
212
212
  Requires-Dist: tomlkit<0.14,>=0.13.2; extra == 'zzz-test-traceback'
213
213
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-traceback'
214
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-traceback'
214
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-traceback'
215
215
  Provides-Extra: zzz-test-types
216
216
  Provides-Extra: zzz-test-typing
217
217
  Requires-Dist: polars-lts-cpu<1.31,>=1.30.0; extra == 'zzz-test-typing'
218
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-typing'
218
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-typing'
219
219
  Provides-Extra: zzz-test-tzlocal
220
220
  Requires-Dist: tzlocal<5.4,>=5.3.1; extra == 'zzz-test-tzlocal'
221
221
  Provides-Extra: zzz-test-uuid
@@ -223,11 +223,11 @@ Provides-Extra: zzz-test-version
223
223
  Requires-Dist: tomlkit<0.14,>=0.13.2; extra == 'zzz-test-version'
224
224
  Provides-Extra: zzz-test-warnings
225
225
  Provides-Extra: zzz-test-whenever
226
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-whenever'
226
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-whenever'
227
227
  Provides-Extra: zzz-test-zipfile
228
228
  Provides-Extra: zzz-test-zoneinfo
229
229
  Requires-Dist: tzdata<2025.3,>=2025.2; extra == 'zzz-test-zoneinfo'
230
- Requires-Dist: whenever<0.9,>=0.8.2; extra == 'zzz-test-zoneinfo'
230
+ Requires-Dist: whenever<0.9,>=0.8.4; extra == 'zzz-test-zoneinfo'
231
231
  Description-Content-Type: text/markdown
232
232
 
233
233
  [![PyPI version](https://badge.fury.io/py/dycw-utilities.svg)](https://badge.fury.io/py/dycw-utilities)
@@ -1,4 +1,4 @@
1
- utilities/__init__.py,sha256=sL0f7a9_XSj0OxG9E_04onbu2cDKar7GrU1t0jU_9So,60
1
+ utilities/__init__.py,sha256=1KLLBbQUSgDlyi5mt8fAcIzoykpEOLEnPlQ-8KDJ2iA,61
2
2
  utilities/altair.py,sha256=Gpja-flOo-Db0PIPJLJsgzAlXWoKUjPU1qY-DQ829ek,9156
3
3
  utilities/asyncio.py,sha256=3OVbJKTYCucrIkM7WSMMkQA9jYJFCQMnGNM4H5rBNgA,29154
4
4
  utilities/atomicwrites.py,sha256=geFjn9Pwn-tTrtoGjDDxWli9NqbYfy3gGL6ZBctiqSo,5393
@@ -26,7 +26,7 @@ utilities/http.py,sha256=WcahTcKYRtZ04WXQoWt5EGCgFPcyHD3EJdlMfxvDt-0,946
26
26
  utilities/hypothesis.py,sha256=a75izXg9aCBhhDkj_ZgK3TDzlzk38evP8TO7JbYYQvg,46264
27
27
  utilities/importlib.py,sha256=mV1xT_O_zt_GnZZ36tl3xOmMaN_3jErDWY54fX39F6Y,429
28
28
  utilities/ipython.py,sha256=V2oMYHvEKvlNBzxDXdLvKi48oUq2SclRg5xasjaXStw,763
29
- utilities/iterables.py,sha256=wqq2lKfEAq1qncE-lR848DHX627aerFaq4BXmLen-NE,43589
29
+ utilities/iterables.py,sha256=mDqw2_0MUVp-P8FklgcaVTi2TXduH0MxbhTDzzhSBho,44915
30
30
  utilities/jupyter.py,sha256=ft5JA7fBxXKzP-L9W8f2-wbF0QeYc_2uLQNFDVk4Z-M,2917
31
31
  utilities/libcst.py,sha256=L0IkwAWXPuNpYyceeJGOC8CAwHdVPRpbXC8MQphCXh4,4954
32
32
  utilities/lightweight_charts.py,sha256=0xNfcsrgFI0R9xL25LtSm-W5yhfBI93qQNT6HyaXAhg,2769
@@ -88,7 +88,7 @@ utilities/warnings.py,sha256=un1LvHv70PU-LLv8RxPVmugTzDJkkGXRMZTE2-fTQHw,1771
88
88
  utilities/whenever.py,sha256=jS31ZAY5OMxFxLja_Yo5Fidi87Pd-GoVZ7Vi_teqVDA,16743
89
89
  utilities/zipfile.py,sha256=24lQc9ATcJxHXBPc_tBDiJk48pWyRrlxO2fIsFxU0A8,699
90
90
  utilities/zoneinfo.py,sha256=-5j7IQ9nb7gR43rdgA7ms05im-XuqhAk9EJnQBXxCoQ,1874
91
- dycw_utilities-0.125.9.dist-info/METADATA,sha256=Lr7FuRGFVTmBQl5RfJRKVA44Nz5TGMHeIKBv4Y4S5eY,12851
92
- dycw_utilities-0.125.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
93
- dycw_utilities-0.125.9.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
94
- dycw_utilities-0.125.9.dist-info/RECORD,,
91
+ dycw_utilities-0.125.11.dist-info/METADATA,sha256=iPt3X8RJ44P_WrBe8mWByZVUftXSyQlmv7jj0VtUOyU,12852
92
+ dycw_utilities-0.125.11.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
93
+ dycw_utilities-0.125.11.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
94
+ dycw_utilities-0.125.11.dist-info/RECORD,,
utilities/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.125.9"
3
+ __version__ = "0.125.11"
utilities/iterables.py CHANGED
@@ -1190,6 +1190,56 @@ def product_dicts(mapping: Mapping[_K, Iterable[_V]], /) -> Iterator[Mapping[_K,
1190
1190
  ##
1191
1191
 
1192
1192
 
1193
+ def range_partitions(stop: int, num: int, total: int, /) -> range:
1194
+ """Partition a range."""
1195
+ if stop <= 0:
1196
+ raise _RangePartitionsStopError(stop=stop)
1197
+ if not (1 <= total <= stop):
1198
+ raise _RangePartitionsTotalError(stop=stop, total=total)
1199
+ if not (0 <= num < total):
1200
+ raise _RangePartitionsNumError(num=num, total=total)
1201
+ q, r = divmod(stop, total)
1202
+ start = num * q + min(num, r)
1203
+ end = start + q + (1 if num < r else 0)
1204
+ return range(start, end)
1205
+
1206
+
1207
+ @dataclass(kw_only=True, slots=True)
1208
+ class RangePartitionsError(Exception): ...
1209
+
1210
+
1211
+ @dataclass(kw_only=True, slots=True)
1212
+ class _RangePartitionsStopError(RangePartitionsError):
1213
+ stop: int
1214
+
1215
+ @override
1216
+ def __str__(self) -> str:
1217
+ return f"'stop' must be positive; got {self.stop}"
1218
+
1219
+
1220
+ @dataclass(kw_only=True, slots=True)
1221
+ class _RangePartitionsTotalError(RangePartitionsError):
1222
+ stop: int
1223
+ total: int
1224
+
1225
+ @override
1226
+ def __str__(self) -> str:
1227
+ return f"'total' must be in [1, {self.stop}]; got {self.total}"
1228
+
1229
+
1230
+ @dataclass(kw_only=True, slots=True)
1231
+ class _RangePartitionsNumError(RangePartitionsError):
1232
+ num: int
1233
+ total: int
1234
+
1235
+ @override
1236
+ def __str__(self) -> str:
1237
+ return f"'num' must be in [0, {self.total - 1}]; got {self.num}"
1238
+
1239
+
1240
+ ##
1241
+
1242
+
1193
1243
  @overload
1194
1244
  def reduce_mappings(
1195
1245
  func: Callable[[_V, _V], _V], sequence: Iterable[Mapping[_K, _V]], /
@@ -1458,6 +1508,7 @@ __all__ = [
1458
1508
  "OneUniqueEmptyError",
1459
1509
  "OneUniqueError",
1460
1510
  "OneUniqueNonUniqueError",
1511
+ "RangePartitionsError",
1461
1512
  "ResolveIncludeAndExcludeError",
1462
1513
  "SortIterableError",
1463
1514
  "always_iterable",
@@ -1502,6 +1553,7 @@ __all__ = [
1502
1553
  "one_unique",
1503
1554
  "pairwise_tail",
1504
1555
  "product_dicts",
1556
+ "range_partitions",
1505
1557
  "reduce_mappings",
1506
1558
  "resolve_include_and_exclude",
1507
1559
  "sort_iterable",