Skip to content

Commit 547c05a

Browse files
committed
ctypes: add __ctype_{be,le}__ class attributes
1 parent 46b01bf commit 547c05a

File tree

1 file changed

+34
-26
lines changed

1 file changed

+34
-26
lines changed

stdlib/ctypes/__init__.pyi

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -219,87 +219,95 @@ class py_object(_CanCastTo, _SimpleCData[_T]):
219219
if sys.version_info >= (3, 14):
220220
def __class_getitem__(cls, item: Any, /) -> GenericAlias: ...
221221

222-
class c_bool(_SimpleCData[bool]):
222+
@type_check_only
223+
class _SwappableCData:
224+
__ctype_be__: ClassVar[type[Self]]
225+
__ctype_le__: ClassVar[type[Self]]
226+
227+
class c_bool(_SwappableCData, _SimpleCData[bool]):
223228
_type_: ClassVar[Literal["?"]]
224229
def __init__(self, value: SupportsBool | SupportsLen | None = ...) -> None: ...
225230

226-
class c_byte(_SimpleCData[int]):
231+
class c_byte(_SwappableCData, _SimpleCData[int]):
227232
_type_: ClassVar[Literal["b"]]
228233

229-
class c_ubyte(_SimpleCData[int]):
234+
class c_ubyte(_SwappableCData, _SimpleCData[int]):
230235
_type_: ClassVar[Literal["B"]]
231236

232-
class c_short(_SimpleCData[int]):
237+
class c_short(_SwappableCData, _SimpleCData[int]):
233238
_type_: ClassVar[Literal["h"]]
234239

235-
class c_ushort(_SimpleCData[int]):
240+
class c_ushort(_SwappableCData, _SimpleCData[int]):
236241
_type_: ClassVar[Literal["H"]]
237242

238-
class c_long(_SimpleCData[int]):
243+
class c_long(_SwappableCData, _SimpleCData[int]):
239244
_type_: ClassVar[Literal["l"]]
240245

241-
class c_ulong(_SimpleCData[int]):
246+
class c_ulong(_SwappableCData, _SimpleCData[int]):
242247
_type_: ClassVar[Literal["L"]]
243248

244-
class c_int(_SimpleCData[int]): # can be an alias for c_long
249+
class c_int(_SwappableCData, _SimpleCData[int]): # can be an alias for c_long
245250
_type_: ClassVar[Literal["i", "l"]]
246251

247-
class c_uint(_SimpleCData[int]): # can be an alias for c_ulong
252+
class c_uint(_SwappableCData, _SimpleCData[int]): # can be an alias for c_ulong
248253
_type_: ClassVar[Literal["I", "L"]]
249254

250-
class c_longlong(_SimpleCData[int]): # can be an alias for c_long
255+
class c_longlong(_SwappableCData, _SimpleCData[int]): # can be an alias for c_long
251256
_type_: ClassVar[Literal["q", "l"]]
252257

253-
class c_ulonglong(_SimpleCData[int]): # can be an alias for c_ulong
258+
class c_ulonglong(_SwappableCData, _SimpleCData[int]): # can be an alias for c_ulong
254259
_type_: ClassVar[Literal["Q", "L"]]
255260

256261
c_int8 = c_byte
257262
c_uint8 = c_ubyte
258263

259-
class c_int16(_SimpleCData[int]): # can be an alias for c_short or c_int
264+
class c_int16(_SwappableCData, _SimpleCData[int]): # can be an alias for c_short or c_int
260265
_type_: ClassVar[Literal["h", "i"]]
261266

262-
class c_uint16(_SimpleCData[int]): # can be an alias for c_ushort or c_uint
267+
class c_uint16(_SwappableCData, _SimpleCData[int]): # can be an alias for c_ushort or c_uint
263268
_type_: ClassVar[Literal["H", "I"]]
264269

265-
class c_int32(_SimpleCData[int]): # can be an alias for c_int or c_long
270+
class c_int32(_SwappableCData, _SimpleCData[int]): # can be an alias for c_int or c_long
266271
_type_: ClassVar[Literal["i", "l"]]
267272

268-
class c_uint32(_SimpleCData[int]): # can be an alias for c_uint or c_ulong
273+
class c_uint32(_SwappableCData, _SimpleCData[int]): # can be an alias for c_uint or c_ulong
269274
_type_: ClassVar[Literal["I", "L"]]
270275

271-
class c_int64(_SimpleCData[int]): # can be an alias for c_long or c_longlong
276+
class c_int64(_SwappableCData, _SimpleCData[int]): # can be an alias for c_long or c_longlong
272277
_type_: ClassVar[Literal["l", "q"]]
273278

274-
class c_uint64(_SimpleCData[int]): # can be an alias for c_ulong or c_ulonglong
279+
class c_uint64(_SwappableCData, _SimpleCData[int]): # can be an alias for c_ulong or c_ulonglong
275280
_type_: ClassVar[Literal["L", "Q"]]
276281

277-
class c_ssize_t(_SimpleCData[int]): # alias for c_int, c_long, or c_longlong
282+
class c_ssize_t(_SwappableCData, _SimpleCData[int]): # alias for c_int, c_long, or c_longlong
278283
_type_: ClassVar[Literal["i", "l", "q"]]
279284

280-
class c_size_t(_SimpleCData[int]): # alias for c_uint, c_ulong, or c_ulonglong
285+
class c_size_t(_SwappableCData, _SimpleCData[int]): # alias for c_uint, c_ulong, or c_ulonglong
281286
_type_: ClassVar[Literal["I", "L", "Q"]]
282287

283-
class c_float(_SimpleCData[float]):
288+
class c_float(_SwappableCData, _SimpleCData[float]):
284289
_type_: ClassVar[Literal["f"]]
285290

286-
class c_double(_SimpleCData[float]):
291+
class c_double(_SwappableCData, _SimpleCData[float]):
287292
_type_: ClassVar[Literal["d"]]
288293

289-
class c_longdouble(_SimpleCData[float]): # can be an alias for c_double
294+
class c_longdouble(_SwappableCData, _SimpleCData[float]): # can be an alias for c_double
290295
_type_: ClassVar[Literal["d", "g"]]
291296

292297
if sys.version_info >= (3, 14) and sys.platform != "win32":
293-
class c_double_complex(_SimpleCData[complex]):
298+
# NOTE: currently (3.14.4) the `__ctype_{be,le}__` attributes of these complex types are missing at runtime:
299+
# https://github.com/python/cpython/issues/148464
300+
301+
class c_double_complex(_SwappableCData, _SimpleCData[complex]):
294302
_type_: ClassVar[Literal["D"]]
295303

296-
class c_float_complex(_SimpleCData[complex]):
304+
class c_float_complex(_SwappableCData, _SimpleCData[complex]):
297305
_type_: ClassVar[Literal["F"]]
298306

299-
class c_longdouble_complex(_SimpleCData[complex]):
307+
class c_longdouble_complex(_SwappableCData, _SimpleCData[complex]):
300308
_type_: ClassVar[Literal["G"]]
301309

302-
class c_char(_SimpleCData[bytes]):
310+
class c_char(_SwappableCData, _SimpleCData[bytes]):
303311
_type_: ClassVar[Literal["c"]]
304312
def __init__(self, value: int | bytes | bytearray = ...) -> None: ...
305313

0 commit comments

Comments
 (0)