Wie kann ich neu definieren Funktionen in python?
Bekam ich eine Funktion in ein bestimmtes Modul zu, dass ich neu definieren möchten(mock) zur Laufzeit zu Testzwecken. Soweit ich das verstehe, definition einer Funktion ist nichts anderes als eine Zuweisung in python(Modul definition selbst ist eine Art von Funktion ausgeführt wird). Als ich sagte, ich möchte Sie hierzu in der setup-test-Fall, so wird die Funktion neu definiert werden, lebt in einem anderen Modul. Was ist die syntax, dies zu tun?
Für Beispiel, 'module1' ist mein Modul und 'func1' ist meiner Funktion, in meinem Testfall habe ich versucht (kein Erfolg):
import module1
module1.func1 = lambda x: return True
- Sie brauchen nicht
return
imlambda
.module1.func1 = lambda x: True
funktionieren sollte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Viele von mocking-Bibliotheken bieten Programme für diese Art von Spott, Sie sollten Sie untersuchen, wie Sie wahrscheinlich bekommen viel Hilfe von Ihnen.
Weisen Sie einfach eine neue Funktion oder ein lambda-Ausdruck, um den alten Namen:
Funktioniert es auch, wenn eine Funktion aus einem anderen Modul:
Wenn Sie möchten, um neu zu laden in der Dolmetscher-Datei foo.py , die Sie Bearbeiten, können Sie eine einfache-to-type-Funktion und benutzen Sie execfile(), aber ich habe gerade gelernt, dass es nicht funktioniert ohne die Globale Liste aller Funktionen, die (leider), es sei denn, jemand hat eine bessere Idee:
Irgendwo in der Datei foo.py:
In den python-interpreter:
Verwenden redef: http://github.com/joeheyming/redef
Wenn rd_f1 geht out of scope oder gelöscht wird, func1 wird zurück zu sein, wieder normal
__del__
aufgerufen, geht out of scope, und auch nach dem Aufrufdel
(in__exit__
). Also ich denke, für die Minderheit, die nicht CPython, dieses Modul muss eine Einschränkung. (PyPy ist die Erklärung von: pypy.readthedocs.org/en/latest/...)__exit__
ist garantiert, aber Sie haben__exit__
verlassen sich aufdel
aufrufen__del__
, das ist das Problem. Sie sollten direkt für die Bereinigung nach__exit__
. Ansonsten, einclose()
jemandem zu erlauben explizit zu säubern. Die "automatische scope" Weg wäre noch erlaubt, aber entmutigt von Ihrem Google docs (wie es fürfile
auch in CPython).__del__
und__exit__
bedeuten unterschiedliche Dinge. Ich denke, ich würde einenclose()
dass die beiden anderen nennen kann, und sicher nennen ihn mehrere Male (entweder durch ein flag oder durch idempotente Operationen). Auch__<func>__
meistens sollte nicht aufgerufen werden.