ch17: update from book draft

This commit is contained in:
Luciano Ramalho
2020-02-18 23:45:05 -03:00
parent 70650841b3
commit aa868e8f75
35 changed files with 788 additions and 31 deletions

View File

@@ -0,0 +1,76 @@
from tree import tree
def test_1_level():
class One: pass
expected = [('One', 0)]
result = list(tree(One))
assert expected == result
def test_2_levels_4_leaves():
class Branch: pass
class Leaf1(Branch): pass
class Leaf2(Branch): pass
class Leaf3(Branch): pass
class Leaf4(Branch): pass
expected = [
('Branch', 0),
('Leaf1', 1),
('Leaf2', 1),
('Leaf3', 1),
('Leaf4', 1),
]
result = list(tree(Branch))
assert expected == result
def test_3_levels_1_leaf():
class X: pass
class Y(X): pass
class Z(Y): pass
expected = [
('X', 0),
('Y', 1),
('Z', 2),
]
result = list(tree(X))
assert expected == result
def test_4_levels_1_leaf():
class Level0: pass
class Level1(Level0): pass
class Level2(Level1): pass
class Level3(Level2): pass
expected = [
('Level0', 0),
('Level1', 1),
('Level2', 2),
('Level3', 3),
]
result = list(tree(Level0))
assert expected == result
def test_4_levels_3_leaves():
class A: pass
class B1(A): pass
class C1(B1): pass
class D1(C1): pass
class B2(A): pass
class D2(C1): pass
class C2(B2): pass
expected = [
('A', 0),
('B1', 1),
('C1', 2),
('D1', 3),
('D2', 3),
('B2', 1),
('C2', 2),
]
result = list(tree(A))
assert expected == result

View File

@@ -0,0 +1,20 @@
def tree(cls):
yield cls.__name__, 0
yield from sub_tree(cls)
# tag::SUB_TREE[]
def sub_tree(cls):
for sub_cls in cls.__subclasses__():
yield sub_cls.__name__, 1
for sub_sub_cls in sub_cls.__subclasses__():
yield sub_sub_cls.__name__, 2
for sub_sub_sub_cls in sub_sub_cls.__subclasses__():
yield sub_sub_sub_cls.__name__, 3
# end::SUB_TREE[]
if __name__ == '__main__':
for cls_name, level in tree(BaseException):
indent = ' ' * 4 * level
print(f'{indent}{cls_name}')