# stream模块说明 stream模块主要定义了python流处理的框架(按流顺序逐个对象进行处理),并基于该框架实现了字符串流的处理类StringStream。 ## 使用StringStream 当需要对字符串进行逐个字符处理的情况(例如进行解析),可以使用StringStream简化实际业务处理逻辑,使用方法有两种: ### 使用实例对象的方法 1、定义处理函数 ``` def dealer_fun1(deal_obj, position): # deal_obj 为流当前处理到的字符对象 # position 为当前处理的字符对象在字符串中的位置 # 以下为自定义对字符处理的具体逻辑 _logger.info('dealer_fun1: position:%s : %s' % (str(position), deal_obj)) ``` 2、初始化并启动流处理 ``` # 初始化流管理对象 _stream = StringStream(stop_by_excepiton=False, logger=None, dealer_exception_fun=None, stream_closed_fun=None) # 在流管理对象中注册处理函数,同一个对象可以放置多个处理函数 _stream.add_dealer(dealer_fun1, dealer_fun2, ....) # 启动流处理,要处理的字符串为str_obj _stream.start_stream(stream_tag='default', is_sync=True, is_pause=False, seek_position=None, move_next_step=None, move_forward_step=None, str_obj='my test string') ``` ### 使用修饰符的方法(更简单) 1、通过修饰符定义处理函数 ``` @StringStream.stream_decorator(stop_by_excepiton=False, logger=_logger, dealer_exception_fun=dealer_exception_fun, stream_closed_fun=stream_closed_fun, stream_tag='stream_dealer', is_sync=True, seek_position=None, move_next_step=None, move_forward_step=None) def string_stream_dealer_3(deal_obj=None, position=0, str_obj='', my_para1='', ...): # deal_obj 为流当前处理到的字符对象 # position 为当前处理的字符对象在字符串中的位置 # str_obj 为要处理的字符串对象(要转换为流的对象)- 注意命名一定是这个命名,不是按顺序就可以 # my_para1为自定义传入的参数(例如传入全局变量配合内部处理) # 以下为自定义对字符处理的具体逻辑 _logger.info('string_stream_dealer_3: my_para1 : %s\n str_obj : %s' % (my_para1, str_obj)) _logger.info('string_stream_dealer_3: position:%s : %s' % (str(position), deal_obj)) ``` 2、通过执行处理函数启动流处理(str_obj为要处理的字符串对象) ``` string_stream_dealer_3(None, 0, str_obj=u'test my string 加上中文', my_para1='my_para3') ``` ## 实现自定义流处理类 1、流处理类必须继承BaseStream类 ``` class StringStream(BaseStream): ... ``` 2、需继承实现BaseStream类的内部处理函数 _init_stream(\*\*kwargs) : 初始化流对象并返回,需注意:**kwargs参数是start_stream方法(或修饰器模式中的处理函数)的自定义参数部分传入,需要在自定义类时明确要求传入所需的必要参数来生成流对象** \_next(stream_obj):从流中获取下一个对象,并将流指针指向下一个位置 \_close_stream(stream_obj):关闭流对象(与_init_stream对应),在中止流处理时调用 \_seek(stream_obj, position): 移动到流的指定位置 \_move_next(stream_obj, step=1): 流从当前位置向后移动指定步数 \_move_forward(stream_obj, step=1): 流从当前位置向前移动指定步数 \_current_position(stream_obj): 获取当前流的位置信息 3、完成以上步骤,就可以按实例方式或修饰符方式使用流对象了!