Делаем атрибуты объекта итеративными - PullRequest
2 голосов
/ 08 января 2011

Мне возвращается список с объектами, которые имеют несколько атрибутов, например:

results = q.fetch(5)
for p in results:
    print "%s %s, %d inches tall" % (p.first_name, p.last_name, p.height

Можно ли перебирать эти атрибуты, чтобы я мог сделать что-то вроде for x in p. Я хочу проверить значение каждого из них, но я не хочу создавать огромный блок операторов IF.

Ответы [ 4 ]

6 голосов
/ 08 января 2011

Я предупреждаю против этого.Есть редкие исключения, когда это оправдано, но почти всегда лучше избегать такого рода хакерских решений.Однако, если вы хотите, вы можете использовать vars(), чтобы получить словарь атрибутов и выполнить его.Как указывает @Nick ниже, App Engine использует свойства вместо значений для определения своих членов, поэтому вы должны использовать getattr() для получения их значений.

results = q.fetch(5)
for p in results:
    for attribute in vars(p).keys()
        print '%s = %s' % (attribute, str(getattr(p, attribute)))

Демонстрация того, что vars() делает:

>>> class A:
...     def __init__(self, a, b):
...         self.a = a
...         self.b = b
... 
>>> a = A(1, 2)
>>> vars(a)
{'a': 1, 'b': 2}
>>> for attribute in vars(a).keys():
...     print '%s = %s' % (attribute, str(getattr(a, attribute)))
... 
a = 1
b = 2
3 голосов
/ 08 января 2011

Вы можете создать подкласс исходного типа переменной и определить собственную хитрую iter (self) функцию, чтобы получить то, что вы хотите.например, чтобы изменить способ повторения словаря: -

>>> class mydict(dict):
...    def __iter__(self):
...      for i in self.items():
...          yield i
... 
>>> x = mydict( {'a' : 1, 'b':2 } )
>>> for i in x:
...   print i
... 
('a', 1)
('b', 2)
1 голос
/ 12 января 2011

Чтобы получить список свойств класса модели, вызовите Model.properties() (или instance.properties() - это метод класса). Это возвращает имена свойств отображения словаря в экземпляры класса Property; Вы можете получить значение свойств, выполнив getattr (instance, name).

Если вы используете Expando, есть также instance.dynamic_properties(), который возвращает список динамически определенных свойств этого объекта.

0 голосов
/ 08 января 2011

Предполагая, что объект, который вы получите от q.fetch(5) с атрибутом __dict__, вы можете просто использовать pprint для отображения вашей информации.

>>> import pprint
>>> results = q.fetch(5)
>>> pprint.pprint(results.__dict__())

Или, в качестве альтернативы, если в нем есть что-то, что можно преобразовать в словарь, аналогичная запись будет работать

>>> pprint.pprint(dict(results.dict_like_property))

Я хотел бы предположить, что это не очень хороший подход, но он действительно подходит для отладки кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...