Skip to content

Commit 881dcb4

Browse files
committed
Add __class_getitem__ support to all datetime types
1 parent 29fd3b8 commit 881dcb4

4 files changed

Lines changed: 28 additions & 0 deletions

File tree

‎Doc/library/datetime.rst‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,11 @@ Constructor:
950950
.. versionchanged:: 3.6
951951
Added the *fold* parameter.
952952

953+
.. versionchanged:: 3.16
954+
:class:`!datetime` now supports the subscript (``[]``) operator for creating
955+
:class:`generic aliases <types.GenericAlias>`, e.g., ``datetime[tzinfo]``.
956+
See :pep:`585` and :ref:`types-genericalias`.
957+
953958

954959
Other constructors, all class methods:
955960

‎Lib/_pydatetime.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import time as _time
1010
import math as _math
1111
import sys
12+
import types as _types
1213
from operator import index as _index
1314

1415
def _cmp(x, y):
@@ -2432,6 +2433,8 @@ def __reduce_ex__(self, protocol):
24322433
def __reduce__(self):
24332434
return self.__reduce_ex__(2)
24342435

2436+
__class_getitem__ = classmethod(_types.GenericAlias)
2437+
24352438

24362439
datetime.min = datetime(1, 1, 1)
24372440
datetime.max = datetime(9999, 12, 31, 23, 59, 59, 999999)

‎Lib/test/datetimetester.py‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,23 @@ def test_divide_and_round(self):
130130
self.assertEqual(dar(6, -4), -2)
131131
self.assertEqual(dar(-6, -4), 2)
132132

133+
def test_datetime_class_getitem(self):
134+
"""Test that datetime class supports subscripting via __class_getitem__."""
135+
from types import GenericAlias
136+
datetime = datetime_module
137+
138+
# Test datetime class can be subscripted
139+
alias = datetime.datetime[tzinfo]
140+
self.assertIsInstance(alias, GenericAlias)
141+
self.assertIs(alias.__origin__, datetime.datetime)
142+
self.assertEqual(alias.__args__, (tzinfo,))
143+
144+
# Test multiple type arguments
145+
alias_multi = datetime.datetime[tzinfo, str]
146+
self.assertIsInstance(alias_multi, GenericAlias)
147+
self.assertIs(alias_multi.__origin__, datetime.datetime)
148+
self.assertEqual(alias_multi.__args__, (tzinfo, str))
149+
133150

134151
#############################################################################
135152
# tzinfo tests

‎Modules/_datetimemodule.c‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7305,6 +7305,9 @@ static PyMethodDef datetime_methods[] = {
73057305
DATETIME_DATETIME___REDUCE_EX___METHODDEF
73067306
DATETIME_DATETIME___REDUCE___METHODDEF
73077307

7308+
{"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS,
7309+
PyDoc_STR("See PEP 585")},
7310+
73087311
{NULL, NULL}
73097312
};
73107313

0 commit comments

Comments
 (0)