2017-12-03 2 views
0

Ich versuche, ein Stück Code zu erstellen, der alles ausgibt, was auf der Konsole geschrieben ist, aber trotzdem alles ausführt, was eine Person darauf schreibt. Zum Beispiel:Wie kann ich drucken, was auch immer auf der Konsole geschrieben ist?

Ich habe diese Funktion:

def create_set(): 
    return [] 

Jedes Mal, wenn jemand setzt dies: c = create_set() in der Konsole. Ich möchte, dass das Programm den Satz erstellt und die Zeichenkette ausgibt "c = create_set()"

Wie kann ich das tun? Etwas Hilfe wäre viel aprecciated

+0

Was meinst du mit "der Konsole"? Versuchen Sie, die REPL zu modifizieren? – Sneftel

+0

Wenn Sie sich beispielsweise in einer Python-Konsole befinden und eine Python-Datei öffnen, stellen Sie sich vor, dass Sie Funktionen für diese Datei haben. Wenn Sie diese Funktionen aufrufen, möchte ich diesen Aufruf als Zeichenfolge ausdrucken und trotzdem das Programm zulassen um diesen Anruf auszuführen. P.S. Ich könnte einfach einen 'print (" Funktionsnamen ")' auf jede Funktion setzen, aber das ist nicht das, was das Programm machen soll. – Daniel

+0

@Daniel: suchen Sie vielleicht nach dem ['pdb'] (https://docs.python.org/3/library/pdb.html) Tool? –

Antwort

0

Sie könnten einen Dekorateur schreiben, der dies tut, aber Sie müssen dies zu jeder Methode per Hand hinzufügen oder eine Magie im Modul __dict__ (die ich nicht empfehlen). Das funktioniert (ich habe es getestet) in Python 3.6, wenn Sie die kommentierte Version in Python 2.7 verwenden. Sie änderten die stack-Signatur von 2.X zu 3.X.

from inspect import stack 
from functools import wraps 

def printer(f): 
    @wraps(f) 
    def wrapped(*args, **kwargs): 
     call_info = stack()[1].code_context # In Python 2.7.X, replace with stack()[1][4] 
     # Use index 1 because 0 is always this wrapper function 
     for context in call_info: 
      print(context.strip()) 

     return f(*args, **kwargs) 
    return wrapped 

es wie folgt verwendet:

@printer 
def test(): 
    return 5 

x = test() 

Dies wird x = test() zu stdout drucken. Wenn Sie dies zum Debuggen möchten, ist das völlig in Ordnung, aber wenn dies etwas ist, auf das Ihr Code in der Produktion angewiesen ist, würde ich es nicht empfehlen, weil es Ihre Leistung zerstören wird, siehe zum Beispiel here.

+0

Ja, das ist zum Debuggen, ich bin irgendwie verzweifelt. Also füge ich das einfach zu der Datei hinzu? – Daniel

+0

Es gibt mir eine Fehlermeldung: 'Traceback (jüngste Aufforderung zuletzt): File "" Linie 1 in File "", Zeile 9, eingewickelt Typeerror: 'NoneType' Objekt nicht iterable' Linie ist 9 ist: 'für Kontext in Call_info:' – Daniel

+0

Verwenden Sie dies in einer Live-Umgebung? Ich habe es gerade wieder in IPython und in einer Datei versucht und es funktioniert für mich mit Python 3.6.2 – RunOrVeith

Verwandte Themen