Дзен Python говорит, что явное лучше, чем неявное.
Тем не менее, питонический способ проверки коллекции c на пустоту таков:
if not c:
# ...
и проверка того, не является ли коллекция пустой, выполняется как:
if c:
# ...
то же самое для всего, что может иметь "нули" или "пустоту" (кортежи, целые числа , strings, None и т. д.)
Какова цель этого? Будет ли мой код более ошибочным, если я этого не сделаю? Или это позволяет использовать больше вариантов использования (например, какой-то полиморфизм), поскольку люди могут переопределить эти логические приведения?
«Простое лучше, чем сложное».
«Читаемость имеет значение.»
Возьмем, к примеру, if users
- это более читабельно, чем if len(users) == 0
Неявный логический полиморфизм является частью многих языков. Фактически, идиома
if msg:
print str(len(msg)) + ' char message: ' + msg
, вероятно, происходит от c!
void print_msg(char * msg) {
if (msg) {
printf("%d char message: %s", (int) strlen(msg), msg);
}
}
Нераспределенный указатель должен содержать NULL
, что удобно для оценки ложно, что позволяет нам избежать ошибки сегментации ,
Это настолько фундаментальная концепция, что это помешает питону отказаться от него. Фактически, учитывая довольно неуклюжую версию булева полиморфизма, доступную в c, сразу становится ясно (по крайней мере для меня), что python сделал это поведение намного более явным, позволяя любому типу иметь настраиваемый, хорошо определил логическое преобразование через __nonzero__
.
if c:
# ...
явно. «Если» явно заявляет, что следующее выражение будет оценено в логическом контексте.
Справедливо утверждать, что
if c == 0:
# ...
понятнее, и начинающий программист может с этим согласиться.
Но опытному программисту (по крайней мере, одному) последнее не совсем понятно, оно избыточно. Я уже знаю, что c будет сравниваться с 0 из-за «если»; Мне не нужно говорить дважды.
Пустые списки с оценкой по False и непустые списки с оценкой по True - такое центральное соглашение Python, что оно достаточно явное. Если бы контекст if-оператора сообщал даже о том, что c
является списком, len(c) == 0
не был бы намного более явным.
Я думаю, что len(c) == 0
только более явно, если вы действительно хотите проверить длину, а не магическую пустоту или пустоту , потому что их оценка может отличаться от проверки длины.