Использование кортежей bools для операторов if

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

0
задан may 7 April 2019 в 13:34
поделиться

2 ответа

Здесь происходит несколько вещей:

Вы используете кортеж в качестве значения ветвления для if. Достоверность предиката указывает только, является ли он пустым или нет, и ничего о его содержимом:

assert bool(tuple()) is False
assert bool((False, )) is True

Во-вторых, если вы заранее знаете количество элементов в кортеже, используя or s и [ 115] s обычно более читабелен, как вы упомянули:

if is_dog or is_cat:
    do_something()

И, наконец, вы можете использовать any для произвольного числа значений:

values = [is_dog, is_cat, ... more]
if any(values):
    do_something()
0
ответ дан Reut Sharabani 7 April 2019 в 13:34
поделиться

Это не хорошая практика, чтобы увидеть, является ли либо bool True:

if (False,False):
    print("it does not do what you think it does")

Вывод:

it does not do what you think it does

См. Python True проверка значения : любой непустой кортеж имеет значение True

. Правильный путь:

if a or b:   
    pass

. Для кратных можно использовать . any() :

if any(x for x in (False, True)):
    pass   # will enter here if any part of the tuple is True
else:
    pass   # will enter here if no part of the tuple is True
0
ответ дан Patrick Artner 7 April 2019 в 13:34
поделиться
Другие вопросы по тегам:

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