| | ``[D day[s], ][H]H:MM:SS[.UUUUUU]``, where D |
| | is negative for negative ``t``. (5) |
+--------------------------------+-----------------------------------------------+
-| ``repr(t)`` | Returns a string in the form |
-| | ``datetime.timedelta(D[, S[, U]])``, where D |
-| | is negative for negative ``t``. (5) |
+| ``repr(t)`` | Returns a string representation of the |
+| | :class:`timedelta` object as a constructor |
+| | call with canonical attribute values. |
+--------------------------------+-----------------------------------------------+
+
Notes:
(1)
return self
def __repr__(self):
- if self._microseconds:
- return "%s.%s(%d, %d, %d)" % (self.__class__.__module__,
- self.__class__.__qualname__,
- self._days,
- self._seconds,
- self._microseconds)
+ args = []
+ if self._days:
+ args.append("days=%d" % self._days)
if self._seconds:
- return "%s.%s(%d, %d)" % (self.__class__.__module__,
- self.__class__.__qualname__,
- self._days,
- self._seconds)
- return "%s.%s(%d)" % (self.__class__.__module__,
+ args.append("seconds=%d" % self._seconds)
+ if self._microseconds:
+ args.append("microseconds=%d" % self._microseconds)
+ if not args:
+ args.append('0')
+ return "%s.%s(%s)" % (self.__class__.__module__,
self.__class__.__qualname__,
- self._days)
+ ', '.join(args))
def __str__(self):
mm, ss = divmod(self._seconds, 60)
def test_repr(self):
name = 'datetime.' + self.theclass.__name__
self.assertEqual(repr(self.theclass(1)),
- "%s(1)" % name)
+ "%s(days=1)" % name)
self.assertEqual(repr(self.theclass(10, 2)),
- "%s(10, 2)" % name)
+ "%s(days=10, seconds=2)" % name)
self.assertEqual(repr(self.theclass(-10, 2, 400000)),
- "%s(-10, 2, 400000)" % name)
+ "%s(days=-10, seconds=2, microseconds=400000)" % name)
+ self.assertEqual(repr(self.theclass(seconds=60)),
+ "%s(seconds=60)" % name)
+ self.assertEqual(repr(self.theclass()),
+ "%s(0)" % name)
+ self.assertEqual(repr(self.theclass(microseconds=100)),
+ "%s(microseconds=100)" % name)
+ self.assertEqual(repr(self.theclass(days=1, microseconds=100)),
+ "%s(days=1, microseconds=100)" % name)
+ self.assertEqual(repr(self.theclass(seconds=1, microseconds=100)),
+ "%s(seconds=1, microseconds=100)" % name)
def test_roundtrip(self):
for td in (timedelta(days=999999999, hours=23, minutes=59,
cls.tearDownClass = tearDownClass
all_test_classes.extend(test_classes)
+ all_test_classes.extend(test_classes)
+
def test_main():
run_unittest(*all_test_classes)
--- /dev/null
+Use keywords in the ``repr`` of ``datetime.timedelta``.
static PyObject *
delta_repr(PyDateTime_Delta *self)
{
- if (GET_TD_MICROSECONDS(self) != 0)
- return PyUnicode_FromFormat("%s(%d, %d, %d)",
- Py_TYPE(self)->tp_name,
- GET_TD_DAYS(self),
- GET_TD_SECONDS(self),
- GET_TD_MICROSECONDS(self));
- if (GET_TD_SECONDS(self) != 0)
- return PyUnicode_FromFormat("%s(%d, %d)",
- Py_TYPE(self)->tp_name,
- GET_TD_DAYS(self),
- GET_TD_SECONDS(self));
-
- return PyUnicode_FromFormat("%s(%d)",
- Py_TYPE(self)->tp_name,
- GET_TD_DAYS(self));
+ PyObject *args = PyUnicode_FromString("");
+
+ if (args == NULL) {
+ return NULL;
+ }
+
+ const char *sep = "";
+
+ if (GET_TD_DAYS(self) != 0) {
+ Py_SETREF(args, PyUnicode_FromFormat("days=%d", GET_TD_DAYS(self)));
+ if (args == NULL) {
+ return NULL;
+ }
+ sep = ", ";
+ }
+
+ if (GET_TD_SECONDS(self) != 0) {
+ Py_SETREF(args, PyUnicode_FromFormat("%U%sseconds=%d", args, sep,
+ GET_TD_SECONDS(self)));
+ if (args == NULL) {
+ return NULL;
+ }
+ sep = ", ";
+ }
+
+ if (GET_TD_MICROSECONDS(self) != 0) {
+ Py_SETREF(args, PyUnicode_FromFormat("%U%smicroseconds=%d", args, sep,
+ GET_TD_MICROSECONDS(self)));
+ if (args == NULL) {
+ return NULL;
+ }
+ }
+
+ if (PyUnicode_GET_LENGTH(args) == 0) {
+ Py_SETREF(args, PyUnicode_FromString("0"));
+ if (args == NULL) {
+ return NULL;
+ }
+ }
+
+ PyObject *repr = PyUnicode_FromFormat("%s(%S)", Py_TYPE(self)->tp_name,
+ args);
+ Py_DECREF(args);
+ return repr;
}
static PyObject *