Skip to content

Commit be45484

Browse files
committed
gh-145166: Address review comments - deduplicate tests and fix indentation
1 parent 6efe847 commit be45484

File tree

2 files changed

+21
-31
lines changed

2 files changed

+21
-31
lines changed

Lib/test/datetimetester.py

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5133,16 +5133,17 @@ def test_pickling(self):
51335133
self.assertEqual(derived.tzname(), 'cookie')
51345134
self.assertEqual(orig.__reduce__(), orig.__reduce_ex__(2))
51355135

5136-
def test_fromutc_subclass_new_returns_non_datetime(self):
5137-
call_count = 0
5138-
5136+
def _make_evil_datetime_class(self):
51395137
class EvilDatetime(self.theclass):
5138+
sabotage = False
51405139
def __new__(cls, *args, **kwargs):
5141-
nonlocal call_count
5142-
call_count += 1
5143-
if call_count > 1:
5140+
if cls.sabotage:
51445141
return bytearray(b'\x00' * 200)
51455142
return super().__new__(cls, *args, **kwargs)
5143+
return EvilDatetime
5144+
5145+
def test_fromutc_subclass_new_returns_non_datetime(self):
5146+
EvilDatetime = self._make_evil_datetime_class()
51465147

51475148
class SimpleTZ(tzinfo):
51485149
def utcoffset(self, dt): return timedelta(hours=1)
@@ -5151,39 +5152,26 @@ def tzname(self, dt): return "Test"
51515152

51525153
tz = SimpleTZ()
51535154
dt = EvilDatetime(2000, 1, 1, 12, 0, 0, tzinfo=tz)
5155+
EvilDatetime.sabotage = True
51545156
with self.assertRaises(TypeError):
51555157
tz.fromutc(dt)
51565158

51575159
def test_fromutc_subclass_new_returns_non_datetime_with_delta(self):
5158-
call_count = 0
5160+
EvilDatetime = self._make_evil_datetime_class()
51595161

5160-
class EvilDatetime(self.theclass):
5161-
def __new__(cls, *args, **kwargs):
5162-
nonlocal call_count
5163-
call_count += 1
5164-
if call_count > 1:
5165-
return bytearray(b'\x00' * 200)
5166-
return super().__new__(cls, *args, **kwargs)
51675162
class SimpleTZ(tzinfo):
51685163
def utcoffset(self, dt): return timedelta(hours=2)
51695164
def dst(self, dt): return timedelta(hours=1)
51705165
def tzname(self, dt): return "Test"
51715166

51725167
tz = SimpleTZ()
51735168
dt = EvilDatetime(2000, 1, 1, 12, 0, 0, tzinfo=tz)
5169+
EvilDatetime.sabotage = True
51745170
with self.assertRaises(TypeError):
51755171
tz.fromutc(dt)
51765172

51775173
def test_utctimetuple_subclass_new_returns_non_datetime(self):
5178-
call_count = 0
5179-
5180-
class EvilDatetime(self.theclass):
5181-
def __new__(cls, *args, **kwargs):
5182-
nonlocal call_count
5183-
call_count += 1
5184-
if call_count > 1:
5185-
return bytearray(b'\x00' * 200)
5186-
return super().__new__(cls, *args, **kwargs)
5174+
EvilDatetime = self._make_evil_datetime_class()
51875175

51885176
class SimpleTZ(tzinfo):
51895177
def utcoffset(self, dt): return timedelta(hours=5)
@@ -5192,6 +5180,7 @@ def tzname(self, dt): return "Test"
51925180

51935181
tz = SimpleTZ()
51945182
dt = EvilDatetime(2000, 6, 15, 12, 0, 0, tzinfo=tz)
5183+
EvilDatetime.sabotage = True
51955184
with self.assertRaises(TypeError):
51965185
dt.utctimetuple()
51975186

Modules/_datetimemodule.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4168,6 +4168,7 @@ tzinfo_fromutc(PyObject *self, PyObject *dt)
41684168
result = add_datetime_timedelta((PyDateTime_DateTime *)dt, delta, 1);
41694169
if (result == NULL)
41704170
goto Fail;
4171+
41714172
Py_DECREF(dst);
41724173
dst = call_dst(GET_DT_TZINFO(dt), result);
41734174
if (dst == NULL)
@@ -6210,14 +6211,14 @@ add_datetime_timedelta(PyDateTime_DateTime *date, PyDateTime_Delta *delta,
62106211
}
62116212

62126213
PyObject *result = new_datetime_subclass_ex(year, month, day,
6213-
hour, minute, second, microsecond,
6214-
HASTZINFO(date) ? date->tzinfo : Py_None,
6215-
Py_TYPE(date));
6216-
if (result != NULL && !PyDateTime_Check(result)) {
6217-
PyErr_Format(PyExc_TypeError,
6218-
"datetime arithmetic on a subclass returned "
6219-
"non-datetime (type %.200s)",
6220-
Py_TYPE(result)->tp_name);
6214+
hour, minute, second, microsecond,
6215+
HASTZINFO(date) ? date->tzinfo : Py_None,
6216+
Py_TYPE(date));
6217+
if (result != NULL && !PyDateTime_Check(result)) {
6218+
PyErr_Format(PyExc_TypeError,
6219+
"datetime arithmetic on a subclass returned "
6220+
"non-datetime (type %.200s)",
6221+
Py_TYPE(result)->tp_name);
62216222
Py_DECREF(result);
62226223
return NULL;
62236224
}

0 commit comments

Comments
 (0)