Python, оцените значение переменной как переменную - PullRequest
4 голосов
/ 11 марта 2009

Я хотел бы сделать что-то вроде ниже: особенно часть 'f.eval (field)', чтобы она оценивала значение переменной как имя поля. Как это сделать в 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''

Ответы [ 4 ]

13 голосов
/ 11 марта 2009

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

4 голосов
/ 11 марта 2009
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 , даже если строки в этом конкретном случае безопасны! Только не привыкай к этому. Если вы получаете строку от пользователя, это может быть вредоносный код.

Закон Мерфи: если что-то пойдет не так, они пойдут.

1 голос
/ 11 марта 2009

Python эквивалент eval() равен eval()

x = 9
eval("x*2")

даст тебе 18.

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

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

0 голосов
/ 11 марта 2009

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

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

test = Testing()
print test.__dict__

Результаты:

{'age': 30, 'name': 'Joe'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...