NDB重复属性列表中的'None'值

1 投票
1 回答
540 浏览
提问于 2025-04-18 06:20

我需要一个属性类型,可以通过Python接口向NDB设置和获取True、False和None的值。对于单个属性,这个操作相对简单。

但是,对于重复属性(repeated=True),似乎无法将列表中的某个项设置为None。无论我尝试什么方法,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],None就会被拒绝。我从后台的“机器”那里收到了以下警告,还有一长串的错误信息。

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

请告诉我我的任务是否不可能,或者应该采取什么方法。

1 个回答

0

_validate这个函数在处理“未知”和“无”的情况时不太正确:

        if value.lower() in ('unknown', 'none'):
            return None

然后,在这个函数的最后部分:

    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

撰写回答