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、完成以上步骤,就可以按实例方式或修饰符方式使用流对象了!