У меня есть два утверждения
return self.getData() if self.getData() else ''
и
return self.getData() or ''
Я хочу знать, они такие же или есть какая-то разница
У меня есть два утверждения
return self.getData() if self.getData() else ''
и
return self.getData() or ''
Я хочу знать, они такие же или есть какая-то разница
Я бы сказал Нет, потому что если self.getData() что-то изменяет во время его работы, то первый оператор имеет возможность возвращать другой результат, так как он сделает второй вызов.
Может быть, но только если self.getData() является чистой функцией и не имеет побочных эффектов. Более того, объект, возвращаемый self.getData(), также должен быть свободным от каких-либо побочных эффектов и последовательно возвращать логическое значение.
В простейшем случае, если f() определяется как:
def f():
return ["Hello World!"]
Тогда следующее:
x = f() if f() else ""
логически эквивалентно:
x = f() or ""
Так как f() рассматривается как логическое выражение в обоих случаях, а f() будет оценивать значение True (ish) или False (ly), оба выражения вернут тот же результат.
Это называется Логическая эквивалентность
В логике утверждения p и q логически эквивалентны, если они имеют то же логическое содержание. Это семантическая концепция; два заявления эквивалентно, если они имеют одинаковое значение истинности в каждой модели (Мендельсон 1979: 56). Логическая эквивалентность p и q иногда выражается как p\equiv q, Epq или p\Leftrightarrow q. Однако эти символы также используется для эквивалентности материалов; правильная интерпретация зависит в контексте. Логическая эквивалентность отличается от материала эквивалентности, хотя эти два понятия тесно связаны.
Они будут иметь одинаковый результат, поскольку оба метода лечения self.getData() приводят к булевому контексту, но остерегайтесь:
1)
return self.getData() if self.getData() else ''
будет запускать функцию getData дважды, а
2)
return self.getData() or ''
будет запускаться только один раз. Это может быть важно, если для выполнения getData() требуется некоторое время, а это означает, что 1) не совпадает с 2), если функция getData() имеет какие-либо побочные эффекты.
Придерживайтесь 2).
Единственное различие, которое я вижу, состоит в том, что первый из них дважды вызовет self.getData(), причем первый из них будет использоваться для вычисления логического значения, а второй может быть возвращен (если первый оценивается как True).
Другая опция будет оценивать функцию только один раз, используя ее как логическую проверку, так и возврат.
Это может иметь решающее значение, если, например, self.getData() удаляет или изменяет данные после их возврата или функция занимает много времени для вычисления.