Я не нахожу это удивительным, и фактически ожидал, что это сработает, когда я первоначально попробовал это.
Хотя не все значения bools
, обратите внимание, что в действительности все значения логические - они представляют собой значения истинности. (В Python bool
- это, по сути, значение, которое only представляет собой true или false.) Число 0
не является логическим, но оно явно (в Python) имеет логическое значение False.
Другими словами, логический оператор and
не всегда возвращает bool
, но он всегда возвращает логическое значение; тот, который представляет истину или ложь, даже если он также имеет другую информацию, логически связанную с ним (например, строку).
Может быть, это обратное обоснование; Я не уверен, но в любом случае логические операторы Python ведут себя так, как они.
Когда его использовать?
В вашем примере test2 мне понятнее. Я могу сказать, что они оба делают одинаково: конструкция в test2 не усложняет понимание. При прочих равных условиях, чем более лаконичен код в test2, тем быстрее становится понятным. Тем не менее, это тривиальное различие, и я не предпочитаю, чтобы я тоже прыгал, чтобы что-то переписать.
Это может быть также полезно другими способами:
a = {
"b": a and a.val,
"c": b and b.val2,
"d": c and c.val3,
}
Это может быть переписано по-другому, но это ясно, прямо и кратко.
Не уходи за борт; «a () и b () или c ()» в качестве замены «a ()? b (): c ()» опасны и сбивают с толку, так как вы получите c (), если b () ложный. Если вы пишете троичное выражение, используйте троичный синтаксис, хотя он ужасно уродлив: b() if a() else c()
.