Является ли это допустимым использованием условного выражения?
Я пытаюсь понять, что лучший способ сделать это:
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:
).