2009-03-11 11 views
4

Ich möchte etwas wie unten tun: insbesondere den 'f.eval (Feld)' Teil, so dass es den Wert der Variablen als Feldname auswertet. Wie schafft man das in Python?Python, werte einen Variablenwert als Variable aus

def punctuated_object_list(objects, field): 
    field_list = [f.eval(field) for f in objects] 
    if len(field_list) > 0: 
     if len(field_list) == 1: 
      return field_list[0] 
     else: 
      return ', '.join(field_list[:-1]) + ' & ' + field_list[-1] 
    else: 
     return u'' 
+0

+1 mit meinem Dank für das Stellen dieser Frage, bevor ich brauchte :). – Alterlife

Antwort

12

getattr(f, field), wenn ich Sie richtig verstanden habe (das heißt, wenn Sie field = "foo" haben könnten, und wollen f.foo). Wenn nicht, möchten Sie vielleicht klären. Python hat eine eval(), und ich weiß nicht, welche anderen Sprachen 'eval() Sie das Äquivalent von wollen.

+0

+1 schlagen mich durch Sekunden :-) Bonus doc: http://docs.python.org/library/functions.html#getattr – bobince

+0

Silly me ... eval (eval()) in Python ... Danke für Ihre Antworten! –

+0

Entschuldigung, du hast mehr Recht! –

0

Das Python-Äquivalent eval() ist eval()

x = 9 
eval("x*2") 

geben Ihnen 18.

v = "x" 
eval(v+"*2") 

auch funktioniert.

+0

Sie haben beide Recht ... Ich kann nicht beide obwohl ;-( –

+0

Eval ist böse! Besser nicht verwenden Sie es überhaupt, es gibt immer einen besseren Weg – hasen

0

Um auf eine Liste aller Felder in einem Python-Objekt zuzugreifen, können Sie auf seine __dict__-Eigenschaft zugreifen.

class Testing(): 
    def __init__(self): 
     self.name = "Joe" 
     self.age = 30 

test = Testing() 
print test.__dict__ 

Ergebnisse:

{'age': 30, 'name': 'Joe'} 
+0

Nicht das gleiche. Das Objekt könnte nicht einmal so leicht haben zugängliches __dict__ (muss möglicherweise etwas wie Objekt .__ getattribute __ (foo, '__dict__') tun, wenn das Objekt gemein ist), und es könnte einen neuen __getattr__ haben. –

4
getattr(object, 'field') #note that field is a string 

f = 'field_name' 
#... 
getattr(object, f) 


#to get a list of fields in an object, you can use dir() 
dir(object) 

Weitere Informationen finden Sie unter: http://www.diveintopython.org/power_of_introspection/index.html

Sie eval nicht verwenden, auch wenn die Saiten sicher in diesem speziellen Fall sind! Mach dich einfach nicht daran gewöhnt. Wenn Sie die Zeichenfolge vom Benutzer erhalten, könnte dies bösartiger Code sein.

Murphys Gesetz: Wenn Dinge schief gehen können, werden sie.

+0

Wer würde den "bösartigen" Code einfügen? Python wird als Quelle verteilt. Warum sollte man versuchen, eval zu brechen, wenn der Code geändert werden kann? Eval ist nicht weniger sicher als der Rest von Python. –

+1

betrachte den Fall, wenn der Code auf einem Server läuft, – hasen

Verwandte Themen