New Features
============
+Improved Error Messages
+-----------------------
+
+* When unpacking assignment fails due to incorrect number of variables, the
+ error message prints the received number of values in more cases than before.
+ (Contributed by Tushar Sadhwani in :gh:`122239`.)
+
+ .. code-block:: pycon
+
+ >>> x, y, z = 1, 2, 3, 4
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ x, y, z = 1, 2, 3, 4
+ ^^^^^^^
+ ValueError: too many values to unpack (expected 3, got 4)
Other Language Changes
>>> a == 4 and b == 5 and c == 6
True
+Unpack dict
+
+ >>> d = {4: 'four', 5: 'five', 6: 'six'}
+ >>> a, b, c = d
+ >>> a == 4 and b == 5 and c == 6
+ True
+
Unpack implied tuple
>>> a, b, c = 7, 8, 9
>>> a, b = t
Traceback (most recent call last):
...
- ValueError: too many values to unpack (expected 2)
+ ValueError: too many values to unpack (expected 2, got 3)
Unpacking tuple of wrong size
>>> a, b = l
Traceback (most recent call last):
...
- ValueError: too many values to unpack (expected 2)
+ ValueError: too many values to unpack (expected 2, got 3)
Unpacking sequence too short
>>> () = [42]
Traceback (most recent call last):
...
- ValueError: too many values to unpack (expected 0)
+ ValueError: too many values to unpack (expected 0, got 1)
+
+Unpacking a larger iterable should raise ValuleError, but it
+should not entirely consume the iterable
+ >>> it = iter(range(100))
+ >>> x, y, z = it
+ Traceback (most recent call last):
+ ...
+ ValueError: too many values to unpack (expected 3)
+ >>> next(it)
+ 4
+
+Unpacking unbalanced dict
+
+ >>> d = {4: 'four', 5: 'five', 6: 'six', 7: 'seven'}
+ >>> a, b, c = d
+ Traceback (most recent call last):
+ ...
+ ValueError: too many values to unpack (expected 3, got 4)
+
+Ensure that custom `__len__()` is NOT called when showing the error message
+
+ >>> class LengthTooLong:
+ ... def __len__(self):
+ ... return 5
+ ... def __getitem__(self, i):
+ ... return i*2
+ ...
+ >>> x, y, z = LengthTooLong()
+ Traceback (most recent call last):
+ ...
+ ValueError: too many values to unpack (expected 3)
+
+For evil cases like these as well, no actual count to be shown
+
+ >>> class BadLength:
+ ... def __len__(self):
+ ... return 1
+ ... def __getitem__(self, i):
+ ... return i*2
+ ...
+ >>> x, y, z = BadLength()
+ Traceback (most recent call last):
+ ...
+ ValueError: too many values to unpack (expected 3)
"""
__test__ = {'doctests' : doctests}
return 1;
}
Py_DECREF(w);
+
+ if (PyList_CheckExact(v) || PyTuple_CheckExact(v)
+ || PyDict_CheckExact(v)) {
+ ll = PyDict_CheckExact(v) ? PyDict_Size(v) : Py_SIZE(v);
+ if (ll > argcnt) {
+ _PyErr_Format(tstate, PyExc_ValueError,
+ "too many values to unpack (expected %d, got %zd)",
+ argcnt, ll);
+ goto Error;
+ }
+ }
_PyErr_Format(tstate, PyExc_ValueError,
"too many values to unpack (expected %d)",
argcnt);