Python variable expansion is a useful feature. Essentially it allows an iterable to be unpacked into separate variables.
number_tests = [ ("a", False), ("1", True), ("1.2", True), ("1.3.4", False), ("", False), ] for testval, expected in number_tests: # ...
This is cleaner than accepting the tuple and then unpacking it yourself.
for test_tuple in number_tests: test_input = test_tuple expected = test_tuple
In fact, when you do inline multi-variable assignments under the hood this is variable expansion.
>>> variable_type = "a", "b" >>> print(type(variable_type)) <class 'tuple'> >>> a, b = variable_type >>> a, b ('a', 'b')
You might have guessed, but the left hand side is also a tuple.
>>> (a, b) = variable_type >>> a, b ('a', b) >>> type(_) <class 'tuple'>
While I’ve known the above rules for years, and enjoyed them frequently when working with comprehensions and iterations, I did not realize you could unpack nested structures in the exact same way. Let’s take a classic example of wanting to
enumerate over an iterable, reusing
number_tests I used to write:
# WRONG for idx, test_tuple in enumerate(number_tests): testval, expected = test_tuple
But you can further expand by declaring the resulting tuple inline with the for loop:
# RIGHT for idx, (testval, expected) in enumerate(number_tests): # Continue on!
This is also completely valid in comprehensions:
>>> [(idx, a, b) for idx, (a, b) in enumerate(number_tests)] [ (0, 'a', False), (1, '1', True), (2, '1.2', True), (3, '1.3.4', False), (4, '', False) ]