FishHook
Проверку на None делают, когда объект может быть нулем, пустой строкой, пустым списком, т.д. и эту ситуацию нужно отделить от случая, когда состояние объекта еще не определено
Метод __bool__ отвечает за поведение объекта в логическом контексте. Он может и полную строку не отличать от пустой.
Там может быть сложный объект. Например, матрица считается истинной, если её главная диагональ заполнена единицами. Или сетевое подключение считается истинным, если в буфере остаётся заданное число блоков.
Вот пример, когда None и __bool__ никак не связаны по смыслу:
>>> class Int(int): ... def __bool__(self): ... return self % 4 == 0 ... >>> def f(n): ... if n > 3: ... x = Int(n + 2) ... globals()['x'] = x ... return x ... >>> bool(f(5)), f(5) is not None (False, True) >>> x 7 >>> bool(f(6)), f(6) is not None (True, True) >>> x 8 >>>
FishHook
проверять args на длину, ИМХО, говнокод.
Допустим, там не простой список аргументов, а типа “умный”:
>>> class Args(list): ... def __bool__(self): ... return len(self) > 3 ... >>> args = Args(('a', 'b', 'c')) >>> >>> if args: ... print('ok', args) ... else: ... print('no', args, len(args)) ... no ['a', 'b', 'c'] 3 >>> >>> args.append('d') >>> >>> if args: ... print('ok', args) ... else: ... print('no', args, len(args)) ... ok ['a', 'b', 'c', 'd'] >>>
В одном случае подойдёт логическая проверка, а вдругом - проверка содержимого.
FishHook
Теоретически в объекте может быть переопределён __len__.
Может быть, но эта теория слабее теории переопределения __bool__. Второе имеет смысл, а первое?