这是条件表达式的有效使用吗?

时间:2015-09-08 09:35:46

标签: python python-3.x

我试图弄清楚这样做的最佳方法是:

resource['contents'][media_type] = []
resource['contents'][media_type].append(row[0].toPython()) if row[0] is not None else None
resource['contents'][media_type].append(row[2].toPython()) if row[2] is not None else None

我认为代码非常简单;如果行有值,则将它们添加到列表中。这种方法是否合适?还有其他方法会更好吗? toPython方法将返回包含对象的字符串描述。

3 个答案:

答案 0 :(得分:16)

使用"三元" conditional expressionx if C else y)副作用根本不是Pythonic。以下是我将如何做到这一点:

resource['contents'][media_type] = []
for index in (0, 2):
    item = row[i]
    if item is not None:
        resource['contents'][media_type].append(item.toPython())

或使用列表理解来减少冗长:

resource['contents'][media_type] = [row[i].toPython() for i in (0, 2) 
                                    if row[i] is not None]

这些方法更具可读性,并减少重复。

答案 1 :(得分:10)

不,这不是对条件表达式的有效使用。它会让任何试图阅读你代码的人感到困惑。

使用if声明;您可以通过创建对列表的另一个引用来节省一些空间:

lst = resource['contents'][media_type] = []
if row[0] is not None: lst.append(row[0].toPython()) 
if row[2] is not None: lst.append(row[2].toPython())

但是为本地引用使用更好的名称(也许是contents?),或者使用列表解析:

resource['contents'][media_type] = [
    col.toPython() for col in (row[0], row[2]) if col is not None]

答案 2 :(得分:2)

我不认为这样做是好习惯。你可以做的是:

resource['contents'][media_type] = []

for irow in [0, 2]:
    if row[irow] is not None:
        resource['contents'][media_type].append(row[irow].toPython())

这使您可以灵活地使用范围(对于range(5)中的irow),或者如果您可以直接访问它们使用行(for row in rows:)。