我试图弄清楚这样做的最佳方法是:
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
方法将返回包含对象的字符串描述。
答案 0 :(得分:16)
使用"三元" conditional expression(x 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:
)。