Classes que implementam o método __len__, quando testadas com if, este método é invocado. Portanto, para uma lista vazia, o teste falha.
x = []; if x: print "OK" # Nao imprime nada
Para mudar este comportamento, basta reimplementar o método __nonzero__.
class MyList(list): def __nonzero__(self): return True x = MyList(); if x: print "OK" # Imprime OK
tem algum exemplo interessante em que bool() deveria retornar True para uma lista-like vazia?
Uma vez estava trabalhando em um toolkit em python para um projeto interno aqui. Entre os widgets tínhamos o tipo Container, um widget que continha outros widgets (Window, Grid, List, etc). Sobrecarreguei o método __len__ para facilitar a consulta de quantos widgets estavam contidos em dado Container.
Acontece que alguém poderia fazer algo assim:
list = create_options_list()
if list:
list.show()
Este teste falhava para uma lista vazia por exemplo. No caso, o teste é para ver se a lista foi criada corretamente. Uma lista, mesmo que vazia, seria válida. A correção é fácil:
if list is not None:
list.show()
Mas achei que neste caso poderia induzir os usuários do toolkit ao erro. Então pesquisei para saber como resolver isto e daí saiu a dica. :)