ndb.ComputedProperty causes 'RuntimeError: maximum recursion depth exceeded'

ndb.ComputedProperty causes 'RuntimeError: maximum recursion depth exceeded'

这是我的 class Stat。我正在向 class 添加一个新的计算 属性,它将自动对现有 class

中的各种计数求和
class Stat(ndb.Model):
   visit_count = ndb.IntegerProperty(default=0)
   exit_count  = ndb.IntegerProperty(default=0)


   # New code
   def _get_total_count(self):
      return self.visit_count + self.exit_count

   response_count = ndb.ComputedProperty(lambda self: self._get_total_count)

当我创建这个 class 的实例并保存它时

stat = Stat(visit_count=0, exit_count=2)
stat.put()

我得到这个异常:

  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/model.py", line 1207, in _value_to_repr
    return repr(val)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/model.py", line 3013, in __repr__
    rep = prop._value_to_repr(val)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/model.py", line 1207, in _value_to_repr
    return repr(val)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/model.py", line 3013, in __repr__
    rep = prop._value_to_repr(val)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/model.py", line 1207, in _value_to_repr
    return repr(val)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/model.py", line 3013, in __repr__
    rep = prop._value_to_repr(val)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/model.py", line 1207, in _value_to_repr
    return repr(val)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/model.py", line 3013, in __repr__
    rep = prop._value_to_repr(val)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/model.py", line 1207, in _value_to_repr
    return repr(val)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/key.py", line 357, in __repr__
    if self.app() != _DefaultAppId():
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/ndb/key.py", line 824, in _DefaultAppId
    return os.getenv('APPLICATION_ID', '_')
  File "/Users/antkong/dev/zeetings/zeetings-ve/bin/../lib/python2.7/os.py", line 515, in getenv
    return environ.get(key, default)
  File "/Users/antkong/dev/zeetings/zeetings-ve/bin/../lib/python2.7/UserDict.py", line 58, in get
    def get(self, key, failobj=None):
RuntimeError: maximum recursion depth exceeded

如果我删除计算 属性,put 可以毫无问题地执行。

我该如何解决这个问题?

response_count = ndb.ComputedProperty(lambda self: self._get_total_count)

意味着您为 ComputedProperty 返回的值是 函数 self._get_total_count - 您没有调用它。

response_count = ndb.ComputedProperty(lambda self: self._get_total_count())