В Python, какой оператор переопределить для «если объект:»? - PullRequest
17 голосов
/ 13 марта 2011

Мне очень удобно проверять, является ли объект "пустым" со следующей конструкцией:

l=[]
if l:
     do_stuff()

Для стандартного списка Python if будет выполняться, только если список не пустой.

У меня вопрос: как я могу реализовать ту же идею для своих собственных объектов?

Ответы [ 3 ]

26 голосов
/ 13 марта 2011

Определите метод __bool__ (Python 3.x) или __nonzero__ (2.x). Или определите оба для переносимости, один из которых возвращает результат другого.

18 голосов
/ 13 марта 2011

Реализация __nonzero__ для Python 2 и __bool__ для Python 3:

class AlwaysTrueObject:
    def __bool__(self):
        return True
    __nonzero__ = __bool__
10 голосов
/ 13 марта 2011

Если вы реализуете __len__, Python сделает это за вас, исходя из предположения, что длина 0 означает, что объект имеет логическое значение False и что он имеет логическое значение True в противном случае.

Если нет смысла внедрять __len__, вы можете реализовать __nonzero__ (или __bool__ в 3.x (изменилось только имя)), который должен возвращать либо True, либо False в зависимости от логического значения объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...