Python: Teste condicional e estruturas de dados vazias

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
This entry was posted in Python and tagged , , , , . Bookmark the permalink.

2 Responses to Python: Teste condicional e estruturas de dados vazias

  1. bhdn says:

    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. :)

Leave a Reply

Your email address will not be published. Required fields are marked *