2016-05-20 23 views
-1

Q: Gibt es eine Möglichkeit, Python, um mir eine Warnung zu geben, wenn es mehr als eine Definition der gleichen Funktion ist, in Konflikt usw.suchen python Warnung für eine mehrfach definierte Funktion

(ich gerade verschwendet wenig Zeit Änderungen an zwei verschiedenen Versionen der gleichen Funktion zu machen)

Ein kleines Beispiel widersprüchlicher Funktionsdefinitionen.

$> cat ./foo2.py 
cat ./foo2.py 
def foo(): 
    print "1st definition of foo()" 
def foo(): 
    print "2nd definition of foo()" 
foo() 

Ausführen - Python verwendet die letzte Definition. (By the way, ist das offiziell definiert? Es ist nützlich Semantik, zB beim Erstellen von Funktionen on the fly in Strings und Auswerten von ihnen. Es ist nützlich in einem Interpreter. Aber es Masken unter bestimmten Umständen maskiert, daher mein Wunsch, eine optionale haben . Warnung)

$> python ./foo2.py 
python ./foo2.py 
2nd definition of foo() 

"python -W all" nicht gibt eine Warnung aus:

$> python -W all ./foo2.py 
python -W all ./foo2.py 
2nd definition of foo() 

auch nicht "Warnungen verwenden".

Für diese Angelegenheit tut python3 die gleiche wie die oben (obwohl python3 Pars um das Argument erfordert :-(zu drucken).

Pylint meldet den Fehler

E: 4, 0: function already defined line 2 (function-redefined) 

aber ich habe die übliche Einwände gegen einzelne Lint-Tools, die jedem geläufig sein sollten, der mit der Programmiersprache vertraut ist (zB Lint ist laut; Lint ist optional, nicht immer ausgeführt; lint ist optional, wurde zB nicht automatisch mit python installiert und benötigt ich, um ein paar Hacks zu machen, um zu installieren (Homebrew Probleme?) - Ich gab fast auf, und wenn ich aufgegeben hätte, würde ich nicht haben Pylint hatte)

Deshalb, auch wenn tut Pylint den Fehler finden, frage ich nach wie vor.

Q: Gibt es eine Möglichkeit, Python selbst zu erhalten einen Fehler oder eine Warnung für mehrfach definierten Funktionen zu berichten?

===

Zum Vergleich und als Reaktion auf Leute, die sagen: „Warum würden Sie wollen, dass in einer dynamischen Sprache?“

Perl ist auch eine dynamische Sprache. Als Perl zum ersten Mal herauskam, gab es solche Warnungen nicht. Aber jetzt tut es das, weil die Leute gemerkt haben, dass solche Warnungen gut für die Codequalität sind.

Perl warnt standardmäßig nicht vor mehreren Definitionen, warnt jedoch mit -Wall oder verwendet eine Warnung.

$> cat foo2.pl 
cat foo2.pl 
sub foo { print "foo#1" } 
sub foo { print "foo#2" } 
foo() 

$> perl -Wall ./foo2.pl 
perl -Wall ./foo2.pl 
Subroutine foo redefined at ./foo2.pl line 2. 
foo 
+0

Nein, gibt es nicht; Python ist eine sehr dynamische Sprache, es gibt nichts, was Sie davon abhält, den Namen etwas anderem zuzuordnen (Funktion oder nicht). – jonrsharpe

+0

Dies ist ein besonderes Beispiel für eine Warnung, die optional aktiviert werden könnte, wie in der allgemeineren Frage [do-python-have-a-use-strict- und-use-warnings-like-in-perl] (http: // : //stackoverflow.com/questions/13425715/does-python-have-a-use-strict-and-use-warnings-like-in-perl) –

+0

Und da die Antwort auf diese Frage war * "nein" * , was hast du erwartet? – jonrsharpe

Antwort

1

Nein, es gibt keine Möglichkeit, Python dazu zu bringen, sich so nativ zu verhalten. Eine Funktionsdefinition ist im Wesentlichen eine Zuweisung zu einem Namen, und Namen in Python können jederzeit neu zugewiesen werden. Funktionen werden im Vergleich zu Ganzzahlen, Strings usw. nicht speziell behandelt.

+0

Nun, dann sollte Python eine solche Warnung haben. (Erwartet religiöse Argumente.) ... Ich werde ein paar Tage in der Hoffnung geben, dass jemand berichten wird, dass es einen Weg gibt, vielleicht in Python3 ... aber ich vermute, dass ich diese Antwort als genehmigt markieren werde Schließlich, da Python eine unreife Sprache zu sein scheint, fehlen Funktionen wie diese für die Codequalität. –

+0

Einen Patch einreichen. – kindall

+0

Fair genug. Wenn ich genug Python für den Produktionscode verwende, kann ich dies tun. Aber ich bin müde von Sprachkriegen. –

1

Sie können alle Funktionen dekorieren und eine Datenbank mit Symbolen erstellen und bei Neudefinitionen warnen.

+0

Ich habe Python-Introspektion verwendet, aber AFAIK meldet nur die letzte Definition einer Funktion. Gibt es eine Möglichkeit, alle Definitionen zu melden? // Das Verzieren aller Funktionen wäre ein Verlust, da der Zweck solcher Überprüfungen darin besteht, Fehler zu finden, und unerfahrene Programmierer, die nicht imstande sind, zu dekorieren, sind die häufigste Quelle für solche Fehler. (Aber keineswegs die einzige ...) –

+1

Sie können eine Funktion erstellen, die alle Methoden in einem Modul schmückt. Um diese Informationen zwischen mehreren Modulen in einem Paket zu teilen, ist eine zusätzliche Verwaltung erforderlich. Vielleicht kann es einfach genug gemacht werden, so dass Benutzer nur etwas importieren müssen und vielleicht eine Funktion aufrufen müssen, um Duplikate zu finden. – totoro

0

Es ist nichts in die Sprache integriert, aber Sie können ein Code-Check-Tool wie pylint (und ich glaube, es gibt andere Tools), die diese Art von Dingen finden und warnen Sie über sie.

+0

Als ich zu meiner Frage hinzufügte: ... die üblichen Einwände gegen einzelne Lint-Tools, die jedem, der mit der Geschichte der Programmiersprachen vertraut ist, bekannt sein sollten. (Z. B. Flusen sind laut; Flusen sind optional, werden nicht immer ausgeführt; Flusen sind optional, oft nicht installiert.) –