Unintentional trailing comma that creates a tuple

In Python, leaving a trailing comma, for example, 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 placed accidentally, it can be difficult to catch such a β€œproblem”, especially for Python newbies.

I think that if we can use PyCharm intelligent code quality control to detect this problem earlier, statically, mypy , pylint or flake8 static code analysis tools.

Or, another idea would be to limit / highlight the creation of one element of tuples implicitly without parentheses. Is it possible?

+5
source share
2 answers

pylint already defines this as a problem ( since version 1.7 ).

For example, here is 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. 
+11
source

This is not an unintended behavior, since the tuple,, and not () operator. The role of parentheses is the same as in arithmetic expressions. Therefore, you cannot limit such a creation in the Python interpreter, otherwise it will be some other language.

I agree that the trailing comma is sometimes unintentional. Lint tools, such as pylint , can often catch such errors using general type inference (i.e., they see that you are trying to add a tuple to a number). (Also note that sometimes trailing commas are useful and less inadvertent, for example in the_only_elem, = our_list .) Another option is to write your own simple linter that checks something like line.rstrip().endswith(',') and '=' in line (the second check is to allow the declaration of a multi-line list to some extent).

0
source

Source: https://habr.com/ru/post/1269110/


All Articles