diff --git a/Doc/library/types.rst b/Doc/library/types.rst index 875916be104..54c3907dec9 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -472,6 +472,12 @@ Standard names are defined for the following types: .. versionadded:: 3.12 +.. class:: CapsuleType + + The type of :ref:`capsule objects `. + + .. versionadded:: 3.13 + Additional Utility Classes and Functions ---------------------------------------- diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index f4948ceec66..c616a27364b 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1,5 +1,6 @@ import builtins import codecs +import _datetime import gc import locale import operator @@ -1581,7 +1582,7 @@ class SizeofTest(unittest.TestCase): x = property(getx, setx, delx, "") check(x, size('5Pi')) # PyCapsule - # XXX + check(_datetime.datetime_CAPI, size('6P')) # rangeiterator check(iter(range(1)), size('3l')) check(iter(range(2**65)), size('3P')) diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index c6bff79f903..da32c4ea647 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -4,6 +4,7 @@ from test.support import run_with_locale, cpython_only import collections.abc from collections import namedtuple import copy +import _datetime import gc import inspect import pickle @@ -636,6 +637,9 @@ class TypesTests(unittest.TestCase): self.assertIsInstance(exc.__traceback__, types.TracebackType) self.assertIsInstance(exc.__traceback__.tb_frame, types.FrameType) + def test_capsule_type(self): + self.assertIsInstance(_datetime.datetime_CAPI, types.CapsuleType) + class UnionTests(unittest.TestCase): diff --git a/Lib/types.py b/Lib/types.py index b4aa19cec40..1484c22ee9d 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -1,6 +1,7 @@ """ Define names for built-in types that aren't directly accessible as a builtin. """ + import sys # Iterators in Python aren't a matter of type but of protocol. A large @@ -330,4 +331,11 @@ EllipsisType = type(Ellipsis) NoneType = type(None) NotImplementedType = type(NotImplemented) +def __getattr__(name): + if name == 'CapsuleType': + import _socket + return type(_socket.CAPI) + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + __all__ = [n for n in globals() if n[:1] != '_'] +__all__ += ['CapsuleType'] diff --git a/Misc/NEWS.d/next/Library/2023-09-20-07-38-14.gh-issue-109599.IaSLJz.rst b/Misc/NEWS.d/next/Library/2023-09-20-07-38-14.gh-issue-109599.IaSLJz.rst new file mode 100644 index 00000000000..8a15e765545 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-09-20-07-38-14.gh-issue-109599.IaSLJz.rst @@ -0,0 +1 @@ +Expose the type of PyCapsule objects as ``types.CapsuleType``.