+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

NDB具有“无”值的重复属性列表

发布于2020-10-22 19:56     阅读(220)     评论(0)     点赞(4)     收藏(4)


0

1

2

3

4

5

6

7

8

我需要一个Property类型,该类型可以使用Python界面设置NDB的True,False和None值并将其获取。对于单个Property属性,这非常容易做到。

但是,对于重复的Property属性(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)

对于单个LOGICAL属性,此代码运行良好,但是一旦我要分配一个列表,例如[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()

请让我知道我的任务是不可能完成的,还是采取哪种方法。


解决方案


_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

0

1

2

3

4

5

6

7

8



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/607359/139c471a94fd9a69809d/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

4 0
收藏该文
已收藏

评论内容:(最多支持255个字符)