Что не так с логикой короткого замыкания в этом коде Java?

Вы неправильно понимаете, как работает update_or_create. Вот что говорят документы :

Метод update_or_create пытается извлечь объект из базы данных на основе заданного kwargs. Если совпадение найдено, оно обновляет поля, переданные в словаре defaults.

blockquote>

Таким образом, в kwargs вы передаете только те значения, которые вам нужны для соответствия, а не обновления. Вероятно, прохождение id или symbol должно быть единственным kwargs, что вам нужно. Все параметры, которые вы хотите обновить, должны быть переданы в defaults.

CryptoPrices.objects.update_or_create(
    key=exchange_rate['id'],
    symbol=exchange_rate['symbol'],
    defaults=dict(
        market_cap_usd=round(float(exchange_rate['market_cap_usd']), 3),
        volume_usd_24h=round(float(exchange_rate['24h_volume_usd']), 3),
        value= round(float(exchange_rate['price_usd']), 3))
)

8
задан DragonBorn 12 May 2009 в 02:48
поделиться

9 ответов

Вы используете короткозамкнутый или. Если первый аргумент истинен, все выражение истинно.

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

Изменить : Как заметил Крис Джестер-Янг, это на самом деле потому, что логические операторы должны иметь ассоциативность слева направо:

if (func1() || (func2() && func3()))

После возврата func1 это становится следующим:

if (true || (func2() && func3()))

После оценки короткого замыкания или становится:

if (true)
25
ответ дан 3 November 2019 в 12:27
поделиться

Функции Java оцениваются в соответствии с правилами приоритета

, потому что «&&» имеет более высокий приоритет, чем «||», оно оценивается первым, потому что у вас не было скобок для установите явный приоритет

, чтобы выражение

(A || B && C) 

, которое является

(T || F && F)

, было заключено в скобки как

(T || (F && F)) 

из-за правил приоритета.

Поскольку компилятор понимает, что если 'A == true', ему не нужно беспокоиться об оценке остальной части выражения, он останавливается после вычисления A.

Если вы заключили в скобки ((A || B) && C) Тогда это будет ложно.

EDIT

Другой способ, как упоминалось в других плакатах, - использовать "|" и "&" вместо "||" и "&&", потому что это останавливает сокращение выражения. Однако из-за правил приоритета конечный результат будет таким же.

6
ответ дан 3 November 2019 в 12:27
поделиться

Java сокращает логические выражения. Это означает, что после выполнения func1 () и возврата true остальная часть этого логического значения не имеет значения, поскольку вы используете оператор или . Независимо от того, что вычисляет func2 () && func3 () , все выражение будет оцениваться как true . Таким образом, Java даже не утруждает себя вычислением func2 () или func3 () .

. остальная часть этого логического значения не имеет значения, поскольку вы используете оператор или . Независимо от того, что вычисляет func2 () && func3 () , все выражение будет оцениваться как true . Таким образом, Java даже не утруждает себя вычислением func2 () или func3 () .

. остальная часть этого логического значения не имеет значения, поскольку вы используете оператор или . Независимо от того, что вычисляет func2 () && func3 () , все выражение будет оцениваться как true . Таким образом, Java даже не утруждает себя вычислением func2 () или func3 () .

.
3
ответ дан 3 November 2019 в 12:27
поделиться

Вы используете операторы быстрого доступа || и &&. Эти операторы не выполняют остальную часть выражения, если результат уже определен. Для || это означает, что если первое выражение истинно, а для && если первое выражение ложно.

Если вы хотите выполнить все части выражения, используйте | и вместо этого &, это не ярлык.

2
ответ дан 3 November 2019 в 12:27
поделиться

Java использует отложенное вычисление.

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

true || (???)

и

false && (???)

всегда будут сокращать .

Чтобы отключить оценку быстрого доступа, используйте | и & вместо || и &&

Мы можем использовать это для хорошего эффекта:

String s;
if (s != null && !s.equals("")) ...

Это означает, что если s равно null, нам даже не нужно будет пытаться вызвать s.equals, и мы не выдадим исключение NullPointerException

2
ответ дан 3 November 2019 в 12:27
поделиться

краткий ответ: оценка короткого замыкания

, поскольку функция func1 () дает истину, нет необходимости продолжать оценку, поскольку она всегда истинна

1
ответ дан 3 November 2019 в 12:27
поделиться

Если функция 1 всегда возвращает истину, то Java не необходимо оценить остальную часть выражения, чтобы определить, что все выражение будет истинным.

1
ответ дан 3 November 2019 в 12:27
поделиться

Если вы хотите, чтобы выполнялись все функции, вы можете отказаться от сокращенных вариантов

if (func1() | func2() & func3()) {
0
ответ дан 3 November 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: