在cast\addition之前处理非类型的python

在cast\addition之前处理非类型的python,python,types,Python,Types,我从数据库中抽出一行,把字段加起来大约15,得到一个总数。但某些字段值将为Null,这会导致在添加字段TypeError时出错:不支持+:“NoneType”和“int”的操作数类型 现在,对于每个字段,我获取字段值并将其设置为“x”,然后检查它是否为无,如果是,则将“x”设置为0 不是很优雅…有没有关于用python更好地处理这个问题的建议 cc您可以像这样轻松完成: result = sum(field for field in row if field) 这是一个更笨重的版本 total

我从数据库中抽出一行,把字段加起来大约15,得到一个总数。但某些字段值将为Null,这会导致在添加字段TypeError时出错:不支持+:“NoneType”和“int”的操作数类型

现在,对于每个字段,我获取字段值并将其设置为“x”,然后检查它是否为无,如果是,则将“x”设置为0

不是很优雅…有没有关于用python更好地处理这个问题的建议


cc

您可以像这样轻松完成:

result = sum(field for field in row if field)

这是一个更笨重的版本

total = (a if a is not None else 0) + (b if b is not None else 0) + ...
这是另一个选择

def ifnull(col,replacement=0):
    return col if col is not None else replacement

total = ifnull(a) + ifnull(b) + ifnull(c) + ...
def non_null( *fields ):
    for f in fields:
        if f is not None:
            yield f

total = sum( non_null( a, b, c, d, e, f, g ) )
这是另一个选择

def ifnull(col,replacement=0):
    return col if col is not None else replacement

total = ifnull(a) + ifnull(b) + ifnull(c) + ...
def non_null( *fields ):
    for f in fields:
        if f is not None:
            yield f

total = sum( non_null( a, b, c, d, e, f, g ) )

还有更好的吗?选项是在数据库中执行此操作。您可以使用COALESCE将db查询更改为将NULL映射为0

假设您有一个名为col1、col2、col3的整型列的表,它可以接受空值

备选案文1:

SELECT coalesce(col1, 0) as col1, coalesce(col2, 0) as col2, coalesce(col3, 0) as col3
FROM your_table;
然后在返回的行上使用Python中的sum,而不必担心是否存在None

备选案文2: 对数据库中的列求和,并在查询中返回总数:

SELECT coalesce(col1, 0) + coalesce(col2, 0) + coalesce(col3, 0) as total
FROM your_table;

在Python中没有更多的工作要做。第二个选项的一个优点是,您可以在查询中选择不属于总和的其他列。您的表中可能有其他列,并且正在进行多个查询以获取表中的不同列?

您还可以使用SUMFILTERONE、ROW或SUMFERD或0作为表中的字段row@John,谢谢你的提示!我不知道你可以在过滤器中使用None'FilterOne,……对我来说总是有点不透明。你至少可以做一些像“filterbool”这样的事情。它们很有效。它们看起来像SQL。这让一些程序员很高兴。我必须承认,我没想到会有这样的评论回复。因为我最初的回答有这个建议。然而,从Python的简洁性来看,很难说这是更好的,尤其是如果他有很多领域需要围绕coalesce展开的话。不过,这是一个很好的选择:@与Python相比,Paolo将coalesce包装在每个字段上是难看且不灵活的,但是如果您有大量的数据和/或行,那么选项2可以消除从db到Python的大量数据传输。数据库使用这些东西非常快。
total = 0.0
for f in fields:
  total += f or 0.0