对于app engine ndb实体,hasattr总是返回True

时间:2016-10-16 15:33:02

标签: python google-app-engine hasattr

我正在将this answer应用于我的项目

这是我的ndb实体,稍后会添加is_deleted。

class FRoom(ndb.Model):  
    location = ndb.StringProperty(default="")
    is_deleted = ndb.BooleanProperty(default=False) #added later 
    #other fileds

当我用logging.info打印我的实体时,我有

FRoom(key=Key('FRoom', 5606822106890240), is_deleted=False, location=u'denizli')
FRoom(key=Key('FRoom', 6169772060311552), is_deleted=False, location=u'aydin' )
FRoom(key=Key('FRoom', 6451247037022208), location=u'bursa')

当我做的时候

for froom in frooms:
    logging.info(hasattr(froom, 'is_deleted')) # gives always True

但是当我这样做的时候:

logging.info(hasattr(froom, 'is_deletedXXX')) #gives me False

我做错了什么?

1 个答案:

答案 0 :(得分:0)

由于设置了is_deleted选项的default属性,这是预期的行为:如果未明确设置该属性,数据存储区将自动返回该默认值。

来自Property Options表:

enter image description here

因此,对于在模型中设置default选项的属性,检查属性是否存在是不必要的 - 它始终存在,因此您可以直接执行:

for froom in frooms:
    logging.info(froom.is_deleted)
    # or
    logging.info(getattr(froom, 'is_deleted'))

hasattr(froom, 'is_deletedXXX')返回False,因为is_deletedXXX模型中没有FRoom属性。