2009-03-11 1 views
4

Я хотел бы сделать что-то вроде ниже: в частности часть «f.eval (field)», так что она оценивает значение переменной как имя поля. Как это можно сделать в Python?Python, Оцените значение переменной как переменную

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 с моей благодарностью за задание этого вопроса, прежде чем мне нужно было :). – Alterlife

ответ

12

getattr(f, field), если я вас правильно понимаю (то есть, если вы, возможно, придется field = "foo", и хотите f.foo). Если нет, вы можете уточнить. У Python есть eval(), и я не знаю, что другие языки eval() вы хотите получить эквивалент.

+0

+1 избили меня за секунды :-) Бонусный документ: http://docs.python.org/library/functions.html#getattr – bobince

+0

Глупый я ... eval (eval()) в python ... спасибо за ваш ответ! –

+0

извините, вы правы! –

0

Питон эквивалент eval() является eval()

x = 9 
eval("x*2") 

даст вам 18.

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

тоже работает.

+0

вы оба правы ... Я не могу отметить оба, хотя :-( –

+0

eval is evil! Лучше не использовать его вообще, всегда есть лучший способ – hasen

0

Чтобы получить список всех полей объекта Python, вы можете получить доступ к своему свойству __dict__.

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

test = Testing() 
print test.__dict__ 

результаты:

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

Не то же самое. Объект может и не иметь такого простого доступный __dict__ (возможно, должен сделать что-то вроде объекта .__ getattribute __ (foo, '__dict__'), если объект является средним), и он может иметь новый __getattr__. –

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) 

Для получения более подробной информации, см: http://www.diveintopython.org/power_of_introspection/index.html

Не используйте Eval, даже если строки являются безопасными в данном случае! Просто не привыкнешь к этому. Если вы получаете строку от пользователя, это может быть вредоносный код.

Закон Мерфи: если все может пойти не так, они будут.

+0

Кто бы ввел «вредоносный» код? Python распространяется как источник. Почему беспорядок вокруг попытки получить eval для разрыва, когда код доступен для изменения? Eval не менее безопасен, чем все остальные Python. –

+1

рассмотрим случай, когда код работает на сервере, – hasen

Смежные вопросы