From 559b529c569fd62ec41b5f8fe90a57416a6ea806 Mon Sep 17 00:00:00 2001 From: guoci Date: Wed, 19 Nov 2025 11:13:42 -0500 Subject: [PATCH 1/8] update `ctypes.CField` --- stdlib/_ctypes.pyi | 10 ++++++++-- stdlib/ctypes/__init__.pyi | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/stdlib/_ctypes.pyi b/stdlib/_ctypes.pyi index c87cf5e326ca..3f35c7d94700 100644 --- a/stdlib/_ctypes.pyi +++ b/stdlib/_ctypes.pyi @@ -195,12 +195,18 @@ class CFuncPtr(_PointerLike, _CData, metaclass=_PyCFuncPtrType): _GetT = TypeVar("_GetT") _SetT = TypeVar("_SetT") -# This class is not exposed. It calls itself _ctypes.CField. @final -@type_check_only class _CField(Generic[_CT, _GetT, _SetT]): + name: str + type: type[_CT] offset: int + byte_offset: int + byte_size: int size: int + is_bitfield: bool + bit_offset: int + bit_size: int + is_anonymous: bool if sys.version_info >= (3, 10): @overload def __get__(self, instance: None, owner: type[Any] | None = None, /) -> Self: ... diff --git a/stdlib/ctypes/__init__.pyi b/stdlib/ctypes/__init__.pyi index 19bd261c67e0..6d82b90bdf4a 100644 --- a/stdlib/ctypes/__init__.pyi +++ b/stdlib/ctypes/__init__.pyi @@ -10,7 +10,7 @@ from _ctypes import ( _CArgObject as _CArgObject, _CData as _CData, _CDataType as _CDataType, - _CField as _CField, + _CField as CField, _CTypeBaseType, _Pointer as _Pointer, _PointerLike as _PointerLike, From d93892f73088f7736393c7b26c358f73ff7b9aef Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 16:18:00 +0000 Subject: [PATCH 2/8] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/ctypes/__init__.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/stdlib/ctypes/__init__.pyi b/stdlib/ctypes/__init__.pyi index 6d82b90bdf4a..c64cee2791ca 100644 --- a/stdlib/ctypes/__init__.pyi +++ b/stdlib/ctypes/__init__.pyi @@ -10,7 +10,6 @@ from _ctypes import ( _CArgObject as _CArgObject, _CData as _CData, _CDataType as _CDataType, - _CField as CField, _CTypeBaseType, _Pointer as _Pointer, _PointerLike as _PointerLike, From 06041342194524928a6eebc72633d35a4ba27fbe Mon Sep 17 00:00:00 2001 From: guoci Date: Wed, 19 Nov 2025 11:23:22 -0500 Subject: [PATCH 3/8] minor fix --- stdlib/ctypes/__init__.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/stdlib/ctypes/__init__.pyi b/stdlib/ctypes/__init__.pyi index c64cee2791ca..19bd261c67e0 100644 --- a/stdlib/ctypes/__init__.pyi +++ b/stdlib/ctypes/__init__.pyi @@ -10,6 +10,7 @@ from _ctypes import ( _CArgObject as _CArgObject, _CData as _CData, _CDataType as _CDataType, + _CField as _CField, _CTypeBaseType, _Pointer as _Pointer, _PointerLike as _PointerLike, From ca3ee3497e2f38b477a8033eb55540a3645e7791 Mon Sep 17 00:00:00 2001 From: guoci Date: Wed, 19 Nov 2025 11:33:08 -0500 Subject: [PATCH 4/8] fix with `sys.version_info` --- stdlib/_ctypes.pyi | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/stdlib/_ctypes.pyi b/stdlib/_ctypes.pyi index 3f35c7d94700..37d1f63d56a5 100644 --- a/stdlib/_ctypes.pyi +++ b/stdlib/_ctypes.pyi @@ -197,16 +197,17 @@ _SetT = TypeVar("_SetT") @final class _CField(Generic[_CT, _GetT, _SetT]): - name: str - type: type[_CT] offset: int - byte_offset: int - byte_size: int size: int - is_bitfield: bool - bit_offset: int - bit_size: int - is_anonymous: bool + if sys.version_info >= (3, 14): + name: str + type: type[_CT] + byte_offset: int + byte_size: int + is_bitfield: bool + bit_offset: int + bit_size: int + is_anonymous: bool if sys.version_info >= (3, 10): @overload def __get__(self, instance: None, owner: type[Any] | None = None, /) -> Self: ... From bd3a7af3d82628224a1cfad61d96d2647528d7d3 Mon Sep 17 00:00:00 2001 From: guoci Date: Wed, 19 Nov 2025 11:55:17 -0500 Subject: [PATCH 5/8] fixes with `sys.version_info >= (3, 14)` --- stdlib/ctypes/__init__.pyi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stdlib/ctypes/__init__.pyi b/stdlib/ctypes/__init__.pyi index 19bd261c67e0..be2e7449ef31 100644 --- a/stdlib/ctypes/__init__.pyi +++ b/stdlib/ctypes/__init__.pyi @@ -55,6 +55,9 @@ if sys.version_info >= (3, 14): else: from _ctypes import POINTER as POINTER, pointer as pointer +if sys.version_info >= (3, 14): + CField = _CField + DEFAULT_MODE: Final[int] class ArgumentError(Exception): ... From 63f64849573fcc6c8437fb93d615cbb6fbbf2c28 Mon Sep 17 00:00:00 2001 From: guoci Date: Wed, 19 Nov 2025 12:00:39 -0500 Subject: [PATCH 6/8] fix with `TypeAlias` --- stdlib/_ctypes.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/_ctypes.pyi b/stdlib/_ctypes.pyi index 37d1f63d56a5..969a44f5b956 100644 --- a/stdlib/_ctypes.pyi +++ b/stdlib/_ctypes.pyi @@ -201,7 +201,7 @@ class _CField(Generic[_CT, _GetT, _SetT]): size: int if sys.version_info >= (3, 14): name: str - type: type[_CT] + type: TypeAlias = _CT byte_offset: int byte_size: int is_bitfield: bool From f24fe70d223111b8e992e53df21d7262e6dc6dcf Mon Sep 17 00:00:00 2001 From: guoci Date: Wed, 19 Nov 2025 17:18:24 -0500 Subject: [PATCH 7/8] fix issue --- stdlib/_ctypes.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/_ctypes.pyi b/stdlib/_ctypes.pyi index 969a44f5b956..37d1f63d56a5 100644 --- a/stdlib/_ctypes.pyi +++ b/stdlib/_ctypes.pyi @@ -201,7 +201,7 @@ class _CField(Generic[_CT, _GetT, _SetT]): size: int if sys.version_info >= (3, 14): name: str - type: TypeAlias = _CT + type: type[_CT] byte_offset: int byte_size: int is_bitfield: bool From 4745da929bb9b4bacb5f9b20d72e42d0d9741a07 Mon Sep 17 00:00:00 2001 From: guoci Date: Thu, 20 Nov 2025 09:50:13 -0500 Subject: [PATCH 8/8] test --- stdlib/_ctypes.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/_ctypes.pyi b/stdlib/_ctypes.pyi index 37d1f63d56a5..1a9c4a2560ac 100644 --- a/stdlib/_ctypes.pyi +++ b/stdlib/_ctypes.pyi @@ -201,7 +201,7 @@ class _CField(Generic[_CT, _GetT, _SetT]): size: int if sys.version_info >= (3, 14): name: str - type: type[_CT] + _type_: type[_CT] byte_offset: int byte_size: int is_bitfield: bool