Unintentional trailing comma that creates a tuple
Asked Answered
C

1

12

In Python, leaving a trailing comma like this is, of course, not a SyntaxError:

In [1]: x = 1 ,

In [2]: x
Out[2]: (1,)

In [3]: type(x)
Out[3]: tuple

But, at the same time, if the trailing comma was put accidentally, it may be difficult to catch this kind of a "problem", especially for Python newcomers.

I am thinking if we can catch this kind of a "problem" early, statically, with the help of PyCharm smart code quality control features; mypy, pylint or flake8 static code analysis tools.

Or, another idea would be to restrict/highlight creating one item tuples implicitly without parenthesis. Is it possible?

Cambrai answered 22/6, 2017 at 13:33 Comment(6)
@onlynone btw, I am not sure what you meant by the first question/statement. Should I put one more "Is it possible?" to the first part of the question? I think it's pretty clear what I meant, but let me know if there is anything that can be improved to make the question cleaner. Thanks.Cambrai
I guess it's fine. It was just oddly phrased: "is it possible (to detect this issue with static code analysis)" is kind of an obvious "yes!" -- that's precisely what static code analysis tools do. And it turns out one of the most popular ones for python, and one you mention yourself, does exactly what you want. The other interpretation, "is it possible (to restrict creating one item tuples without parens)", would seem to be an obvious "no" since it's just how python works.Mencius
PEP8 is unusually vague describing this use of trailing commas as "OK, but confusing: " I would expect more authoritative guidance python.org/dev/peps/pep-0008/#when-to-use-trailing-commasCoralline
There is nothing 'implicit' about a trailing comma; it is explicitly documented that commas are what makes tuples, not parentheses, so 1, is pretty explicit. Yes, static analysis can help you find cases where you create a one-element tuple.Agalloch
@MartijnPieters okay, sure, we can call it less explicit then :) Thanks.Cambrai
Thanks. I spent 3 hours debugging because of a damn comma lol. Extra thanks, I was making an app in flutter where adding trailing commas is important to format the code correctly. cries. P.S. I just googled tuple python and none of the top results mention that adding a comma is what creates a tuple not the bracketsSignify
M
23

pylintalready detects this as a problem (as of version 1.7).

For example, here's my tuple.py:

"""Module docstring to satisfy pylint"""

def main():
    """The main function"""
    thing = 1,
    print(type(thing))

if __name__ == "__main__":
    main()
$ pylint tuple.py
No config file found, using default configuration
************* Module tuple
R:  5, 0: Disallow trailing comma tuple (trailing-comma-tuple)

------------------------------------------------------------------
Your code has been rated at 8.00/10 (previous run: 8.00/10, +0.00)

$ pylint --help-msg trailing-comma-tuple
No config file found, using default configuration
:trailing-comma-tuple (R1707): *Disallow trailing comma tuple*
  In Python, a tuple is actually created by the comma symbol, not by the
  parentheses. Unfortunately, one can actually create a tuple by misplacing a
  trailing comma, which can lead to potential weird bugs in your code. You
  should always use parentheses explicitly for creating a tuple. This message
  belongs to the refactoring checker. It can't be emitted when using Python <
  3.0.
Mencius answered 22/6, 2017 at 17:49 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.