Ist es möglich, eine Funktion in Python vorwärts zu deklarieren? Ich möchte eine Liste mit meiner eigenen cmp
Funktion sortieren, bevor sie deklariert wird.
print "\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)])
Ich habe meinen Code so organisiert, dass die Definition der cmp_configs
Methode nach dem Aufruf eingefügt wird. Es schlägt mit diesem Fehler fehl:
NameError: name 'cmp_configs' is not defined
Gibt es eine Möglichkeit, die cmp_configs
Methode zu "deklarieren" , bevor sie verwendet wird? Es würde meinen Code sauberer aussehen lassen?
Ich gehe davon aus, dass einige Leute versucht sein werden, mir zu sagen, dass ich meinen Code einfach neu organisieren sollte, damit ich dieses Problem nicht habe. Es gibt jedoch Fälle, in denen dies wahrscheinlich unvermeidbar ist, beispielsweise bei der Implementierung einiger Formen der Rekursion. Wenn Ihnen dieses Beispiel nicht gefällt, nehmen Sie an, dass ich einen Fall habe, in dem es wirklich notwendig ist, eine Funktion weiterzuleiten.
Stellen Sie sich diesen Fall vor, in dem eine Vorwärtsdeklaration einer Funktion in Python erforderlich wäre:
def spam():
if end_condition():
return end_result()
else:
return eggs()
def eggs():
if end_condition():
return end_result()
else:
return spam()
Wo end_condition
und end_result
wurden zuvor definiert.
Ist die einzige Lösung, um den Code neu zu organisieren und Definitionen immer vor Aufrufen zu setzen?
quelle
main()
?import your_module
Sie können den Aufruf in eine eigene Funktion einbinden.
Damit
wird brechen, aber
wird richtig funktionieren.
Die allgemeine Regel in
Python
ist nicht, dass die Funktion im Code höher definiert werden sollte (wie inPascal
), sondern dass sie vor ihrer Verwendung definiert werden sollte.Hoffentlich hilft das.
quelle
if __name__=="__main__":
Lösung funktioniert.Wenn Sie Ihr Skript wie folgt starten:
dann müssen Sie sich wahrscheinlich nicht um Dinge wie "Vorwärtsdeklaration" kümmern. Sie sehen, der Interpreter würde alle Ihre Funktionen laden und dann Ihre main () - Funktion starten. Stellen Sie natürlich sicher, dass auch alle Importe korrekt sind ;-)
Kommen Sie und denken Sie darüber nach, ich habe noch nie so etwas wie "Forward Declaration" in Python gehört ... aber andererseits könnte ich mich irren ;-)
quelle
Wenn sich der Aufruf von cmp_configs in einer eigenen Funktionsdefinition befindet, sollte dies in Ordnung sein. Ich werde ein Beispiel geben.
Im Allgemeinen wird Ihr Problem behoben, wenn Sie Ihren Code in Funktionen (wie main ()) einfügen. Rufen Sie einfach main () am Ende der Datei auf.
quelle
Ich entschuldige mich für die Wiederbelebung dieses Threads, aber es gab eine Strategie, die hier nicht diskutiert wurde und möglicherweise anwendbar ist.
Mit Reflexion ist es möglich, etwas zu tun, das der Vorwärtsdeklaration ähnelt. Angenommen, Sie haben einen Codeabschnitt, der folgendermaßen aussieht:
Auf diese Weise haben wir festgelegt, welche Funktion wir aufrufen möchten, bevor sie tatsächlich definiert wird, effektiv eine Vorwärtsdeklaration. In Python die Aussage
globals()[function_name]()
ist das gleiche wiefoo()
beifunction_name = 'foo'
den oben erörterten Gründen, da Python jede Funktion vor dem Aufruf es Nachschlag muss. Wenn man dastimeit
Modul verwendet, um zu sehen, wie diese beiden Aussagen verglichen werden, haben sie genau den gleichen Rechenaufwand.Natürlich ist das Beispiel hier sehr nutzlos, aber wenn man eine komplexe Struktur hat, die eine Funktion ausführen muss, aber vorher deklariert werden muss (oder strukturell macht es wenig Sinn, sie danach zu haben), kann man einfach einen String und speichern Versuchen Sie später, die Funktion aufzurufen.
quelle
In Python gibt es keine Vorwärtsdeklaration. Sie müssen nur sicherstellen, dass Ihre Funktion deklariert ist, bevor sie benötigt wird. Beachten Sie, dass der Hauptteil einer Funktion erst interpretiert wird, wenn die Funktion ausgeführt wird.
Betrachten Sie das folgende Beispiel:
Sie können sich vorstellen, dass ein Funktionskörper nur ein weiteres Skript ist, das interpretiert wird, sobald Sie die Funktion aufrufen.
quelle
Nein, ich glaube nicht, dass es eine Möglichkeit gibt, eine Funktion in Python vorwärts zu deklarieren.
Stellen Sie sich vor, Sie sind der Python-Interpreter. Wenn Sie an die Linie kommen
Entweder wissen Sie, was cmp_configs ist, oder Sie wissen es nicht. Um fortzufahren, müssen Sie cmp_configs kennen. Es spielt keine Rolle, ob es eine Rekursion gibt.
quelle
Manchmal ist ein Algorithmus von oben nach unten am einfachsten zu verstehen, angefangen bei der Gesamtstruktur bis hin zu den Details.
Sie können dies ohne Vorwärtserklärungen tun:
quelle
Ausgabe:
quelle
Sie können eine Funktion in Python nicht vorwärts deklarieren. Wenn Sie Logik ausführen lassen, bevor Sie Funktionen definiert haben, haben Sie wahrscheinlich sowieso ein Problem. Fügen Sie Ihre Aktion
if __name__ == '__main__'
am Ende Ihres Skripts ein (indem Sie eine Funktion ausführen, die Sie "main" nennen, wenn sie nicht trivial ist), und Ihr Code wird modularer und Sie können ihn bei Bedarf als Modul verwenden zu.Ersetzen Sie dieses Listenverständnis auch durch einen Generator Express (dh
print "\n".join(str(bla) for bla in sorted(mylist, cmp=cmp_configs))
)Verwenden Sie auch nicht
cmp
, was veraltet ist. Verwendenkey
und bieten Sie eine Funktion, die weniger als ist.quelle
Importieren Sie die Datei selbst. Angenommen, die Datei heißt test.py:
quelle
"Organisieren Sie einfach meinen Code neu, damit ich dieses Problem nicht habe." Richtig. Leicht zu schaffen. Funktioniert immer.
Sie können die Funktion immer vor ihrer Referenz bereitstellen.
"Es gibt jedoch Fälle, in denen dies wahrscheinlich unvermeidbar ist, beispielsweise bei der Implementierung einiger Formen der Rekursion."
Ich kann nicht sehen, wie das überhaupt aus der Ferne möglich ist. Bitte geben Sie ein Beispiel für einen Ort an, an dem Sie die Funktion vor ihrer Verwendung nicht definieren können.
quelle
Jetzt warte eine Minute.
cmp_configs
Was genau erwarten Sie von Ihrem Modul, wenn es die print-Anweisung in Ihrem Beispiel erreicht hat , bevor es definiert wurde?Wenn Ihre Veröffentlichung einer Frage mit print wirklich versucht, so etwas darzustellen:
Dann müssen Sie diese nicht definieren,
cmp_configs
bevor Sie diese Anweisung ausführen. Definieren Sie sie einfach später im Code, und alles wird gut.Wenn Sie nun versuchen,
cmp_configs
als Standardwert eines Arguments auf das Lambda zu verweisen , ist dies eine andere Geschichte:Jetzt müssen Sie eine
cmp_configs
Variable definieren, bevor Sie diese Zeile erreichen.[BEARBEITEN - Dieser nächste Teil stellt sich als nicht korrekt heraus, da der Standardargumentwert beim Kompilieren der Funktion zugewiesen wird und dieser Wert auch dann verwendet wird, wenn Sie den Wert von cmp_configs später ändern.]
Glücklicherweise ist es Python egal , als was er definiert, da er
cmp_configs
so typanpassend ist , also könnten Sie einfach mit dieser Aussage vorwegnehmen:Und der Compiler wird sich freuen. Stellen Sie nur sicher, dass Sie den Real deklarieren,
cmp_configs
bevor Sie ihn aufrufenfn
.quelle
Eine Möglichkeit besteht darin, eine Handlerfunktion zu erstellen. Definieren Sie den Handler frühzeitig und stellen Sie den Handler unter alle Methoden, die Sie aufrufen müssen.
Wenn Sie dann die Handler-Methode aufrufen, um Ihre Funktionen aufzurufen, sind sie immer verfügbar.
Der Handler könnte ein Argument annehmen
nameOfMethodToCall
. Verwendet dann eine Reihe von if-Anweisungen, um die richtige Methode aufzurufen.Dies würde Ihr Problem lösen.
quelle
Ja, wir können das überprüfen.
Eingang
Ausgabe
Wie BJ Homer oben erwähnt hat, lautet eine allgemeine Regel in Python nicht, dass die Funktion im Code höher definiert werden sollte (wie in Pascal), sondern dass sie vor ihrer Verwendung definiert werden sollte.
Hoffentlich hilft das.
quelle
print_lyrics()
in Zeile 1 nicht aufgerufen (verwendet), bevor es definiert ist? Ich habe diesen Code kopiert und versucht, ihn auszuführen, und es wird der FehlerNameError: name 'print_lyrics' is not defined
in Zeile 1 angezeigt. Können Sie das erklären?