Блоги

Магические методы и пустые списки в Python

Автор: CoolPython

Методы с двойным подчеркиванием в начале и в конце, например, __eq__, __hash__, __init__, в Python называют магическими методами. Их назвали так потому, что они добавляют магию в поведение класса.

Например, метод __init__ неявно вызывается при инициализации объекта:

Foo:
    def __init__(self, a, b):
        self.a = a
        self.b = b

foo = Foo(7, 9) # вызывается __init__ 
print(foo.a, foo.b) # 7, 9

Но сегодня я хочу поговорить о магичесом методе __bool__. В тех классах, где этот метод определен, он сообщает интерпретатору, как оценить булево значение произвольного объекта.

Зачем нам это? Это нестареющая классика: чтобы проверить словарь или список на непустоту, начинающие часто используют стиль, как в C++:

if len(a) != 0:
    pass

В то время как PEP8 рекомендует делать просто:

if not a: 
    pass

И это работает ровно потому, что в момент if a: вызывается метод __bool__ класса список.

Для пользовательских объектов, где __bool__ не перегружен, по умолчанию возвращается True.

if foo:
    print(True)
else:
    print(False)

#  True

Но если добавить

Foo:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __bool__(self):
        return False

То поведение изменится:

if foo:
    print(True)
else:
    print(False)

#  False

Кстати, в случае, если метода __bool__ в классе нет, то интерпретатор будет искать метод __len__ (длина). Поведение такое же: если __len__ возвращает 0, то логическое значение оценивается как False.

Что с этим делать? Помнить, что falsy (значения, которые оцениваются как False) в Python это:

  • пустые словари {},
  • списки [],
  • кортежи (),
  • множества set(),
  • строки «»,
  • пустые range(0),
  • нули любого численного типа: 0, 0.0, 0j
  • константы None и собственно False

А truthy значения это:

  • любые пользовательские объекты по умолчанию
  • непустые словари, множества, строки, списки, …
  • константа True

И писать проверку на непустоту красиво:

not a: 
    pass

Марина

Recent Posts

10 удалённых Python-вакансий

Если вы ищете работу на Python, на Talanto.work сейчас есть варианты для junior, middle, senior…

6 месяцев ago

Где искать Python-вакансии в 2026 году: зачем на Talanto.work появился отдельный сценарий поиска

Рынок Python-вакансий большой, но удобным его назвать сложно. Формально вакансий много, однако в реальном поиске…

6 месяцев ago

Срезы в Python со всеми подробностями

Срезы в Python — это больше, чем a[2:7]. В статье — быстрый разбор полезных приёмов:…

8 месяцев ago

Возведение в степень в Python: полное руководство

В этой статье мы рассмотрим возведение в степень в Python с помощью различных методов, от…

9 месяцев ago

Как удалить дубликаты из списка Python?

Дубликаты в списке Python — частая проблема. В статье показано, как быстро убрать повторы, в…

9 месяцев ago

Виртуальный (shared) хостинг от SpaceWeb: технический обзор

Услуга виртуального хостинга на SpaceWeb позволяет арендовать часть сервера (shared-сервера) и разместить на нём свой…

11 месяцев ago