GAE pythonでのランダムな「AttributeError: ‘~’ object has no attribute ‘~’」の原因

GoogleAppEngine(GAE)のpythonでハマったのでメモ。
具体的には以下のエラーが出た。

AttributeError: ‘~’ object has no attribute ‘=’

~のところには、自分で設定した名前が入る。
このエラーが出るだけなら、単純なんだけど、名前の間違いとか、データが入っていないとかは無くて、それでもなぜかエラーが出たり出なかったりする。この出たり出なかったりという反応の仕方をするので解決に時間がかかった。完璧に100%エラーが出るなら原因は特定しやすいんだけど。

具体的には以下の様な使い方をしていた。

class datax(ndb.Model):
cat = ndb.IntegerProperty()

まず上の用に設定して、以下のようにデータを取り出す。

q = datax.query()
qry2 = q.filter(~)
qry3 = qry2.order(-~)
qry4 = qry3.fetch(1)
datay = qry4[0].cat

~の部分は省略。
この時に、上記のAttributeErrorが出たり出なかったりした。いろいろ試して最後やっと解決したけど、原因は

class datax(ndb.Model):
cat = ndb.IntegerProperty()

の部分だった。class datax(ndb.Model)というのは実際には、

class datax(ndb.Model):
cat = ndb.IntegerProperty()
dog = ndb.IntegerProperty()
bird = ndb.IntegerProperty()
frog = ndb.IntegerProperty()

なんだけど、このファイル内で使うのは、

cat = ndb.IntegerProperty()

だけだったから、

class datax(ndb.Model):
cat = ndb.IntegerProperty()

ファイル内をスッキリさせるために、上記のように使うものだけ入れて書いていた。最初試しに省略したら、普通に問題なく動いたので、これでいいんだと思い込んでいた。で、上記の部分を全ファイル省略せずに書くようにしたら、エラーが完璧に0になった。どういう仕組でエラーが出たり出なかったりしていたのかはわからないけどもとりあえず解決して良かった。

コメントを残す