2016-03-20 16 views
-4

Ich habe eine Funktion:Raw Text als Argument Zeichenfolge in Python

def list_printer(name): 
    frame = sys._getframe(1) 
    print(name, '=', repr(eval(name, frame.f_globals, frame.f_locals))) 
    return 

und eine Liste:

my_list = [1, 2, 3, 4, 5] 

Wenn sie aufgerufen wird es wie folgt aussieht:

list_printer('my_list') 

und Ausgänge :

my_list = [1, 2, 3, 4, 5] 

Die Sache ist, wie Sie sehen können, muss ich eine Zeichenfolge als Argument verwenden, gibt es eine Möglichkeit, wie ich rohen Text eingeben und dann in eine Zeichenfolge innerhalb der Funktion konvertieren kann, so dass ich keine Anführungszeichen verwenden muss?

+11

Äh, wenn Sie das Objekt selbst übergeben wollen, was ist dann der Sinn dieses schrecklichen Frame/Eval-Zeugs? Warum nicht einfach 'print (meine_liste)'? –

+0

Testen Sie die Klasse des Objekts ('isinstance()') übergeben. Wenn eine Schnur dann kannst du all das Zeug machen. Wenn nicht eine Zeichenkette dann drucken Sie es einfach aus. – cdarke

Antwort

0

Erstens ist "roher Text" kein Begriff. Ich glaube, Sie fragen, ob Sie eine Variable direkt an eine Funktion übergeben können, die den Namen und den Wert der Variablen ausgibt.

Dies ist nicht möglich, weil Variablennamen nicht direkt an die Werte gebunden sind, die sie darstellen - sie sind pointers or references. Das bedeutet, dass beim Aufruf f(my_list) der Wertmy_list Referenzen an f() übergeben wird, aber nicht den Namen "my_list".

Wenn Sie einen Variablennamen zusammen mit seinem Wert drucken möchten, müssen Sie eine Art von Reflexion durchführen (was Ihre list_printer-Methode macht), um den aktuellen Status Ihres Programms zu überprüfen und die Variable "my_list" zu identifizieren.

Natürlich, da Sie die Variablennamen als String sowieso angeben müssen, könnte man genauso gut definiert nur eine einfachere Funktion, die ein Text-Label mit einer Variablen verknüpft, etwa so:

def print_value(name, value): 
    print('%s = %s' % (name, value)) 

, die kann man rufen Sie wie folgt:

print_value('my_list', my_list) 

Aber Sie könnten auch mehr Kontext, in dem name Feld setzen, zum Beispiel:

print_value('my_list, defined in my_module', my_list) 

Um Debugging weiter zu unterstützen. Vielleicht möchten Sie auch in den Python-Debugger pdb schauen, da Sie einen Debugger grundsätzlich manuell neu erstellen.

Verwandte Themen