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

Mis*_*ate 5 python algorithm firebase-realtime-database

我有一个带有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
Run Code Online (Sandbox Code Playgroud)

这工作正常,紧凑,但有一个主要问题:我将获得数据库已损坏的信息,但不会丢失哪些字段(可能只是其中之一,或更多,或全部!)

惯用法应该是

if self.foo is None:
    self.isValid = False
    return ErrorCode.CORRUPTED_DATABASE, "FOO IS MISSING" # could be a string, an enum value, whatever, I have the information

if self.bar is None:
    self.isValid = False
    return ErrorCode.CORRUPTED_DATABASE, "BAR IS MISSING"

if self.bip is None:
    self.isValid = False
    return ErrorCode.CORRUPTED_DATABASE, "BIP IS MISSING"
Run Code Online (Sandbox Code Playgroud)

但这并不漂亮,没有分解(所有我的'来自db'函数的init都使用相同的模式......我不想在这种情况下将我的行数乘以10倍).

这不是一个'100%python'的问题,但是我希望这句话能让我像老板一样处理这个问题(它的蟒蛇:通常会这样!)

Joh*_*ica 1

您可以将检查提取到生成器中,并将标志和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))
Run Code Online (Sandbox Code Playgroud)

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