Определение "boolness" класса в Python - PullRequest
64 голосов
/ 21 ноября 2011

Почему это не так, как можно было наивно ожидать?

class Foo(object):
    def __init__(self):
        self.bar = 3
    def __bool__(self):
        return self.bar > 10

foo = Foo()

if foo:
    print 'x'
else:
    print 'y'

(вывод x)

Ответы [ 3 ]

67 голосов
/ 21 ноября 2011

Для совместимости с Python 2-3 просто добавьте это в ваш пример:

Foo.__nonzero__ = Foo.__bool__

или расширьте исходное определение Foo, включив в него:

__nonzero__ = __bool__

Конечно, вы можете определитьи наоборот, где имя метода - __nonzero__, а вы присваиваете ему __bool__, но я думаю, что имя __nonzero__ - это просто наследие оригинальной интерпретации Python объектов, основанных на правдивости или ложности.на их эквивалентность с нуля.Просто добавьте приведенное выше утверждение, и ваш код будет работать с Python 2.x и будет автоматически работать при обновлении до Python 3.x (и в конечном итоге вы отбросите назначение до __nonzero__).

56 голосов
/ 21 ноября 2011

В * Python 3 используется метод __bool__. Для Python 2 требуется __nonzero__.

24 голосов
/ 21 ноября 2011

Поскольку соответствующий специальный метод называется __nonzero__() в Python 2, а не __bool__() до Python 3.

...