У меня есть два утверждения
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()
удаляет или изменяет данные после их возврата или функция занимает много времени для вычисления.