我收到一个包含多个属性的列表,如下所示:
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语句块。
答案 0 :(得分:6)
我警告不要这样做。很少有例外情况需要保证,但几乎所有时候最好避免使用这种黑客解决方案。但是,如果您愿意,可以使用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
答案 1 :(得分:3)
您可以对原始变量类型进行子类化,并定义自己的狡猾 iter (自我)函数,以获得所需内容。 例如改变字典迭代的方式: -
>>> 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)
答案 2 :(得分:1)
要获取模型类的属性列表,请调用Model.properties()
(或instance.properties()
- 这是一种类方法)。这会返回一个字典映射属性名称到Property类实例;您可以通过执行getattr(实例,名称)来获取属性的值。
如果您使用的是Expando
,那么还会instance.dynamic_properties()
,它会返回该对象上动态定义属性的列表。
答案 3 :(得分:0)
假设您从[{1}}获取的对象具有q.fetch(5)
属性,您只需使用__dict__
即可显示您的信息。
pprint
或者,如果它具有可以转换为字典的内容,则类似的符号可以起作用
>>> import pprint
>>> results = q.fetch(5)
>>> pprint.pprint(results.__dict__())
我建议,这不是一个好的方法,但它确实适用于调试代码。