Зачем неявно проверять пустоту в Python? [closed]

Дзен Python говорит, что явное лучше, чем неявное.

Тем не менее, питонический способ проверки коллекции c на пустоту таков:

if not c:
    # ...

и проверка того, не является ли коллекция пустой, выполняется как:

if c:
    # ...

то же самое для всего, что может иметь "нули" или "пустоту" (кортежи, целые числа , strings, None и т. д.)

Какова цель этого? Будет ли мой код более ошибочным, если я этого не сделаю? Или это позволяет использовать больше вариантов использования (например, какой-то полиморфизм), поскольку люди могут переопределить эти логические приведения?

30
задан Yuval Adam 23 June 2011 в 19:23
поделиться

4 ответа

«Простое лучше, чем сложное».

«Читаемость имеет значение.»

Возьмем, к примеру, if users - это более читабельно, чем if len(users) == 0

7
ответ дан 27 November 2019 в 23:59
поделиться

Неявный логический полиморфизм является частью многих языков. Фактически, идиома

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__.

4
ответ дан 27 November 2019 в 23:59
поделиться
if c:
    # ...

явно. «Если» явно заявляет, что следующее выражение будет оценено в логическом контексте.

Справедливо утверждать, что

if c == 0:
    # ...

понятнее, и начинающий программист может с этим согласиться.

Но опытному программисту (по крайней мере, одному) последнее не совсем понятно, оно избыточно. Я уже знаю, что c будет сравниваться с 0 из-за «если»; Мне не нужно говорить дважды.

5
ответ дан 27 November 2019 в 23:59
поделиться

Пустые списки с оценкой по False и непустые списки с оценкой по True - такое центральное соглашение Python, что оно достаточно явное. Если бы контекст if-оператора сообщал даже о том, что c является списком, len(c) == 0 не был бы намного более явным.

Я думаю, что len(c) == 0 только более явно, если вы действительно хотите проверить длину, а не магическую пустоту или пустоту , потому что их оценка может отличаться от проверки длины.

1
ответ дан 27 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

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