What is the syntax rule for having trailing commas in tuple definitions?
In the case of a single element tuple, the trailing comma is required.
a = ('foo',)
What about a tuple with multiple elements? It seems that whether the trailing comma exists or not, they are both valid. Is this correct? Having a trailing comma is easier for editing in my opinion. Is that a bad coding style?
a = ('foo1', 'foo2')
b = ('foo1', 'foo2',)
Solution 1:
It is only required for single-item tuples to disambiguate defining a tuple or an expression surrounded by parentheses.
(1) # the number 1 (the parentheses are wrapping the expression `1`)
(1,) # a 1-tuple holding a number 1
For more than one item, it is no longer necessary since it is perfectly clear it is a tuple. However, the trailing comma is allowed to make defining them using multiple lines easier. You could add to the end or rearrange items without breaking the syntax because you left out a comma on accident.
e.g.,
someBigTuple = (
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
#...
10000000000,
)
Note that this applies to other collections (e.g., lists and dictionaries) too and not just tuples.
Solution 2:
In all cases except the empty tuple the comma is the important thing. Parentheses are only required when required for other syntactic reasons: to distinguish a tuple from a set of function arguments, operator precedence, or to allow line breaks.
The trailing comma for tuples, lists, or function arguments is good style especially when you have a long initialisation that is split over multiple lines. If you always include a trailing comma then you won't add another line to the end expecting to add another element and instead just creating a valid expression:
a = [
"a",
"b"
"c"
]
Assuming that started as a 2 element list that was later extended it has gone wrong in a perhaps not immediately obvious way. Always include the trailing comma and you avoid that trap.
Solution 3:
Another advantage of trailing commas is that it makes diffs look nicer. If you started with
a = [
1,
2,
3
]
and changed it to
a = [
1,
2,
3,
4
]
The diff would look like
a = [
1,
2,
- 3
+ 3,
+ 4
]
Whereas if you had started with a trailing comma, like
a = [
1,
2,
3,
]
Then the diff would just be
a = [
1,
2,
3,
+ 4,
]
Solution 4:
It's optional: see the Python wiki.
Summary: single-element tuples need a trailing comma, but it's optional for multiple-element tuples.