15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

A solução é sobrescrever o método ToDictMixin._traverse presente na classe

BinaryTreeWithParent para que processe apenas valores relevantes, evitando

ciclos encontrados pelo mix-in. No exemplo a seguir, o método _traverse é

sobrescrito para que não cruze os limites da classe-mãe e simplesmente insira

seu valor numérico:

def _traverse(self, key, value):

if (isinstance(value, BinaryTreeWithParent) and

key == 'parent'):

return value.value # Evita laços circulares

else:

return super()._traverse(key, value)

Uma chamada a BinaryTreeWithParent.to_dict funciona sem problemas porque

as propriedades que contêm a referência circular não são seguidas.

root = BinaryTreeWithParent(10)

root.left = BinaryTreeWithParent(7, parent=root)

root.left.right = BinaryTreeWithParent(9, parent=root.left)

print(root.to_dict())

>>>

{'left': {'left': None,

'parent': 10,

'right': {'left': None,

'parent': 7,

'right': None,

'value': 9},

'value': 7},

'parent': None,

'right': None,

'value': 10}

Definindo BinaryTreeWithParent._traverse, também permitimos que qualquer

classe que tenha um atributo do tipo BinaryTreeWithParent possa trabalhar com

ToDictMixin.

class NamedSubTree(ToDictMixin):

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!