2017-06-22 8 views
5

In Python erstellt, wie dies ein Komma zu verlassen ist, natürlich, keine SyntaxError:Unbeabsichtigte Komma, die ein Tupel

In [1]: x = 1 , 

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

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

Aber zur gleichen Zeit, wenn das Komma wurde versehentlich gesetzt, kann es schwierig sein, diese Art von "Problem" zu fangen, vor allem für Python-Neulinge.

Ich denke, wenn wir können fangen diese Art von „Problem“ early, statisch, mit Hilfe von PyCharm Smart Code Qualitätskontrolle Funktionen; mypy, pylint oder flake8 statische Code-Analyse-Tools.

Oder eine andere Idee wäre einzuschränken/Highlight Erstellen eines Elements Tupel implizit ohne Klammern. Ist es möglich?

+0

@onlynone btw, ich bin nicht sicher, was Sie durch die erste Frage/Aussage gemeint. Sollte ich einen mehr setzen "Ist es möglich?" zum ersten Teil der Frage? Ich denke, es ist ziemlich klar, was ich meinte, aber lassen Sie mich wissen, ob es etwas gibt, das verbessert werden kann, um die Frage sauberer zu machen. Vielen Dank. – alecxe

+1

Ich denke, es ist in Ordnung. Es wurde nur seltsam formuliert: "Ist es möglich (um dieses Problem mit der statischen Code-Analyse zu entdecken)" ist ein naheliegendes "Ja!" Genau das machen statische Code-Analyse-Tools. Und es stellt sich heraus, einer der beliebtesten für Python, und einer, den Sie selbst erwähnen, tut genau das, was Sie wollen. Die andere Interpretation, "ist es möglich (um das Erstellen eines Item-Tupels ohne Parens einzuschränken)", scheint ein offensichtliches "Nein" zu sein, da Python genau so funktioniert. – onlynone

+1

PEP8 ist ungewöhnlich vage und beschreibt die Verwendung von abschließenden Kommas als "OK, aber verwirrend:" Ich würde mehr autoritative Anleitung erwarten https://www.python.org/dev/peps/pep-0008/#when-in-use- Nachkommastellen –

Antwort

11

pylint erkennt dies bereits als ein Problem (as of version 1.7).

Zum Beispiel, hier ist mein 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. 
0

Es ist kein unbeabsichtigtes Verhalten, da der Tupeloperator ,, nicht () ist. Die Rolle der Klammern ist hier die gleiche wie in arithmetischen Ausdrücken. Sie können diese Erstellung in einem Python-Interpreter nicht einschränken, anderenfalls wäre es eine andere Sprache.

Ich stimme zu, dass ein hinteres Komma manchmal unbeabsichtigt ist. Lint-Tools wie pylint sind oft in der Lage, solche Fehler mittels allgemeiner Typinferenz zu erfassen (d. H. Sie sehen, dass Sie versuchen, einer Zahl ein Tupel hinzuzufügen). (Beachten Sie auch, dass nachfolgende Kommas nützlich und weniger unbeabsichtigt sind, z. B. in the_only_elem, = our_list.) Eine weitere Option besteht darin, einen eigenen einfachen Linter zu schreiben, der nach etwas wie line.rstrip().endswith(',') and '=' in line sucht (die zweite Überprüfung ermöglicht eine mehrzeilige Listendeklaration in gewissem Umfang).

+0

Ihr Linter Checker würde (zumindest in meinem Code) viele falsche Positive ergeben: 'data = func (param1, \ nparam2 ...)' – MariusSiuram

+0

@MariusSiuram Es gibt keinen "linter checker" in der Antwort, nur ein Illustration. Ich erwähnte, dass es nicht makellos ist. –