Является ли это допустимым использованием условного выражения?

Я пытаюсь понять, что лучший способ сделать это:

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 вернет описание строки содержащегося объекта.

Ответ 1

Использование "тройного" условного выражения (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]

Эти подходы более читабельны и уменьшают дублирование.

Ответ 2

Нет, это не допустимое использование условного выражения. Это смущает любого, кто пытается прочитать ваш код.

Используйте оператор 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]

Ответ 3

Я не думаю, что это считается хорошей практикой. Вместо этого вы можете:

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

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

Это позволяет вам гибко использовать диапазоны (для irow in range(5)) или использовать строки, если вы можете получить к ним доступ напрямую (for row in rows:).