Timer(superMegaIntenseFunction(10))
bedeutet "anrufen superMegaIntenseFunction(10)
, dann das Ergebnis an übergeben Timer
". Das ist eindeutig nicht das, was du willst. Timer
erwartet entweder einen aufrufbaren (so wie es sich anhört: etwas, das aufgerufen werden kann, wie eine Funktion) oder einen String (damit der Inhalt des Strings als Python-Code interpretiert werden kann). Timer
funktioniert, indem Sie das aufrufbare Ding wiederholt aufrufen und sehen, wie viel Zeit benötigt wird.
Timer(superMegaIntenseFunction)
würde die Typprüfung bestehen, da superMegaIntenseFunction
aufrufbar ist. Ich Timer
würde jedoch nicht wissen, an welche Werte übergeben werden soll superMegaIntenseFunction
.
Der einfache Weg, dies zu umgehen, besteht natürlich darin, eine Zeichenfolge mit dem Code zu verwenden. Wir müssen ein 'Setup'-Argument an den Code übergeben, da die Zeichenfolge in einem neuen Kontext "als Code interpretiert" wird - sie hat keinen Zugriff darauf globals
, sodass Sie ein weiteres Stück Code ausführen müssen, um die Definition zu erstellen verfügbar - siehe Antwort von @ oxtopus.
Mit lambda
(wie in der Antwort von @ Pablo) können wir den Parameter 10
an einen Aufruf von binden superMegaIntenseFunction
. Alles , was wir tun , eine andere Funktion schafft, die keine Argumente übernimmt, und fordert superMegaIntenseFunction
mit 10
. Es ist so, als hätten Sie def
eine andere Funktion wie diese erstellt, nur dass die neue Funktion keinen Namen erhält (weil sie keinen benötigt).