NDB重复属性列表中的'None'值
我需要一个属性类型,可以通过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