【问题标题】:ndb.ComputedProperty causes 'RuntimeError: maximum recursion depth exceeded'ndb.ComputedProperty 导致“运行时错误:超出最大递归深度”
【发布时间】:2016-01-14 20:17:17
【问题描述】:

这是我的班级Stat。我正在向类中添加一个新的计算属性,它将自动总结现有类中的各种计数

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)

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

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 可以毫无问题地执行。

我该如何解决这个问题?

【问题讨论】:

    标签: python-2.7 google-app-engine google-cloud-datastore app-engine-ndb


    【解决方案1】:
    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())
    

    【讨论】:

      猜你喜欢
      • 2018-01-14
      • 2016-12-10
      • 2017-10-25
      • 2014-05-08
      • 1970-01-01
      • 2018-12-03
      • 2017-07-18
      • 2021-12-11
      • 2019-07-03
      相关资源
      最近更新 更多