Python NDB重复属性列表,带';无';价值观

Python NDB重复属性列表,带';无';价值观,python,google-app-engine,app-engine-ndb,Python,Google App Engine,App Engine Ndb,我需要一个属性类型,可以使用Python接口设置和获取NDB的True、False和None值。对于单个属性属性,这相当容易做到 但是,对于重复的属性属性(repeated=True),似乎不可能将列表项设置为无。无论我尝试过哪种方法,NDB库都会引发异常 一次尝试如下所示: class LOGICAL(ndb.GenericProperty): def _set_value(self, entity, value): if isinstance(value, (list, tup

我需要一个属性类型,可以使用Python接口设置和获取NDB的True、False和None值。对于单个属性属性,这相当容易做到

但是,对于重复的属性属性(repeated=True),似乎不可能将列表项设置为无。无论我尝试过哪种方法,NDB库都会引发异常

一次尝试如下所示:

class LOGICAL(ndb.GenericProperty):

  def _set_value(self, entity, value):
    if isinstance(value, (list, tuple, set, frozenset)):
        for i, val in enumerate(value):
            if isinstance(val, str):
                if val.lower() in ('unknown', 'none'):
                    value[i] = None
    if isinstance(value, str):
        if value.lower() in ('unknown', 'none'):
            value = None
    ndb.Property._set_value(self, entity, value)

  def _validate(self, value):
    if isinstance(value, str):
        if value.lower() == 'true':
            return True
        if value.lower() == 'false':
            return False
        raise AssertionError('LOGICAL must be one of "true","false","unknown","none" or'
                             'True, False, None.')
    if value is not None:
        assert isinstance(value, bool)
这段代码对于单个逻辑属性运行良好,但只要我想分配一个列表,比如[True、'false',None],就不会拒绝任何一个。我从后台的“机器”和一个很长很长的堆栈跟踪中得到以下警告

WARNING:root:initial generator _put_tasklet(context.py:270) raised AssertionError()
WARNING:root:suspended generator put(context.py:748) raised AssertionError()

请让我知道我的任务是否不可能,或者采取哪种方法。

\u validate
无法正确处理“未知”和“无”的情况:

然后,在函数的最后:

    return value
因此,结果函数是:

def _validate(self, value):
    if isinstance(value, str):
        if value.lower() == 'true':
            return True
        if value.lower() == 'false':
            return False
        if value.lower() in ('unknown', 'none'):    # Add these two lines
            return None
        raise AssertionError('LOGICAL must be one of "true","false","unknown","none" or'
                             'True, False, None.')
    if value is not None:
        assert isinstance(value, bool)
    return value

此解决方案无法解决此问题。此外,在_validatesimple中返回None会告诉NDB不要转换该值。换句话说,您正在将字符串“unknown”或“none”放入数据存储,而我正在将其放入none.Hmmm。。。你说得对。也许这个答案会有帮助:您需要查看完整的stacktrace,您提供的位没有用处。然后我们可以查看引起错误的较低级别的代码。我的直觉是你无法做到这一点,但需要查看ndb或更低版本中导致错误的特定代码。我想我解决了这个问题,但它并不漂亮。在我的类LOGICAL(它是ndb.Property的子类)中,我重载了Property.\u set\u value和Property.\u apply\u to\u value以简单地将从ndb\u从\u base\u value方法中产生的任何字符串“unknown”替换为None。
def _validate(self, value):
    if isinstance(value, str):
        if value.lower() == 'true':
            return True
        if value.lower() == 'false':
            return False
        if value.lower() in ('unknown', 'none'):    # Add these two lines
            return None
        raise AssertionError('LOGICAL must be one of "true","false","unknown","none" or'
                             'True, False, None.')
    if value is not None:
        assert isinstance(value, bool)
    return value