Source code for commonutil.traversal
# -*- coding: utf-8 -*-
""" 資料遊走輔助函式 / Structured content traversal routines """
[docs]def iter_nested_text_list(l, indent_text="\t"):
# type: (Iterator[str], str) -> Generator[str]
"""
將多層的字串串列物件攤平為單層的字串串列物件
Flatten multiple-level (nested) text list object into one-level text list
Args:
l: 要攤平的字串串列物件 / text list object to be flatten
indent_text="\t": 縮排文字 / text to indent content of nested level
Yield:
依據串列層次進行縮排調整的字串
"""
for t in l:
if t is None:
yield None
elif isinstance(t, basestring):
yield t
else:
for u in iter_nested_text_list(t, indent_text):
yield None if (u is None) else (indent_text + u)
[docs]class NestedTextListFlattener(object):
""" 將多層的文字輸出為單層的遊走器 """
def __init__(self, indent_text="\t", container_class=None, *args, **kwds):
# type: (str, Callable[[Generator[str]], Any]) -> None
"""
建構子 / Constructor
Args:
indent_text="\t": 縮排文字 / text to indent content of nested level
container_class=None: 儲存輸出用的容器類別,當 None 時直接傳回 Generator 物件 / Container class to keep result data. Result into Generator object if None is given.
"""
super(NestedTextListFlattener, self).__init__(*args, **kwds)
self.indent_text = indent_text
self.container_class = container_class
def __call__(self, *args):
g = iter_nested_text_list(args, self.indent_text)
return g if (self.container_class is None) else self.container_class(g)
# vim: ts=4 sw=4 ai nowrap