Python检查一个或多个值是否为None并知道哪个值

2024-05-23 18:32:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有Firebase数据库后端的Python应用程序。在

当我从数据库中检索数据时,我想检查这些值是否 可用(如果不可用,则意味着数据库已损坏,因为缺少强制字段)

我目前的实现如下:

self.foo = myDbRef.get('foo')
self.bar =  myDbRef.get('bar')
self.bip =  myDbRef.get('bip')
self.plop = myDbRef.get('plop')

if self.foo is None or self.bar is None or self.bip is None or self.plop is None:
    self.isValid = False
    return ErrorCode.CORRUPTED_DATABASE

这很好,很紧凑,但有一个主要问题:我会得到数据库损坏的信息, 但不是缺少什么字段(可能只是其中一个字段,或更多字段,或全部字段!)在

惯用的方法应该是

^{pr2}$

但这不是很好,不是因式分解(我所有的'init from db'函数都使用相同的模式。。。我不想把我的 在这种情况下,行数为10)。在

这不是一个“100%python”的问题,但我希望语言能让我像老板一样处理这个问题(这是python:通常是这样!)在


Tags: or数据selfnone数据库应用程序getif
3条回答

我创建了一个类来包含一些我无法访问的功能。我还将ErrorCode作为一个hack,因为我的工具中没有定义ErrorCode,而且我不确定您希望如何将None名称与ErrorCode一起返回。在

构建名称和值的dict,检查dict是否不包含None值,如果包含,则返回哪些键:

myDbRef = {'foo' : None,
            'bar': 1,
            'bip': 2,
            'plop': 3}
class Foo():

    def __init__(self):

        self.foo = myDbRef.get('foo')
        self.bar =  myDbRef.get('bar')
        self.bip =  myDbRef.get('bip')
        self.plop = myDbRef.get('plop')


    def check(self):

        temp_dict = {}

        for key in ['foo','bar','bip','plop']:
            temp_dict[key] = myDbRef.get(key)

        vals = {k:v for k,v in temp_dict.items() if v is None}
        if vals:
            self.isValid = False
            return ("ErrorCode.CORRUPTED_DATABASE", [k for k in vals.keys()])


f = Foo()
print(f.check())

结果:('ErrorCode.CORRUPTED_DATABASE', ['foo'])

使用函数和循环:

def checknone(**things_with_names):
    for name, thing in things_with_names.items():
        if thing is None:
            return ErrorCode.CORRUPTED_DATABASE, name + " IS MISSING"
    return True

并以此方式使用:

^{pr2}$

为了获得最大的收益,将它作为一个类的方法,您将把它混合到所有使用它的类中。这样它也可以设置isValid。在

您可以将检查提取到生成器中,并将标志和return语句保留在外部。在

def invalid_fields():
    if self.foo is None: yield "FOO"
    if self.bar is None: yield "BAR"
    if self.bip is None: yield "BIP"

invalid = list(invalid_fields())
if invalid:
    self.isValid = False
    return ErrorCode.CORRUPTED_DATABASE, "MISSING {}".format(", ".join(invalid))

这样做的好处是,如果有多个字段,则可以告诉您所有缺少的字段。在

相关问题 更多 >