class Page(object):
def __init__(self, name, pages=None):
self.name = name
self.pages = pages if pages is not None else []
def __iter__(self):
return iter(self.pages) # only immediate children
def walk(self, topdown=True): # all pages recursively
if topdown:
yield self
for page in self:
for subpage in page.walk(topdown):
yield subpage
if not topdown:
yield self
page = Page('FirstPage', [
Page('FirstChild', [
Page('FirstChildChild'),
Page('SecondChildChild'),
]),
Page('SecondChild'),
])
for p in page.walk():
print(p.name)
Y2xhc3MgUGFnZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHBhZ2VzPU5vbmUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLnBhZ2VzID0gcGFnZXMgaWYgcGFnZXMgaXMgbm90IE5vbmUgZWxzZSBbXQogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBpdGVyKHNlbGYucGFnZXMpICMgb25seSBpbW1lZGlhdGUgY2hpbGRyZW4KICAgIGRlZiB3YWxrKHNlbGYsIHRvcGRvd249VHJ1ZSk6ICMgYWxsIHBhZ2VzIHJlY3Vyc2l2ZWx5CiAgICAgICAgaWYgdG9wZG93bjoKICAgICAgICAgICAgeWllbGQgc2VsZgogICAgICAgIGZvciBwYWdlIGluIHNlbGY6CiAgICAgICAgICAgIGZvciBzdWJwYWdlIGluIHBhZ2Uud2Fsayh0b3Bkb3duKToKICAgICAgICAgICAgICAgIHlpZWxkIHN1YnBhZ2UKICAgICAgICBpZiBub3QgdG9wZG93bjoKICAgICAgICAgICAgeWllbGQgc2VsZgoKCnBhZ2UgPSBQYWdlKCdGaXJzdFBhZ2UnLCBbCiAgICAgICAgUGFnZSgnRmlyc3RDaGlsZCcsIFsKICAgICAgICAgICAgICAgIFBhZ2UoJ0ZpcnN0Q2hpbGRDaGlsZCcpLAogICAgICAgICAgICAgICAgUGFnZSgnU2Vjb25kQ2hpbGRDaGlsZCcpLAogICAgICAgICAgICAgICAgXSksCiAgICAgICAgUGFnZSgnU2Vjb25kQ2hpbGQnKSwKICAgICAgICBdKQoKZm9yIHAgaW4gcGFnZS53YWxrKCk6CiAgICBwcmludChwLm5hbWUpCg==