def _get_single_bs( cls, data: OutputData, datastd: OutputDataConfig, stm: io.RawIOBase, enc: str = "utf-8", ) -> bytes: """输出带文件体的数据类型""" res: bytes = None try: if not isinstance(data, OutputData) or stm is None or not stm.readable(): cls._logger.error( "Invalid OutputData object or stream for output single") return res for seg in data.get_output_segs(): # seg: OutputDataSeg = data.get_output_segs() fields: dict = cls._parse_fields(seg, datastd) if not isinstance(fields, dict) or len(fields) < 1: cls._logger.error( "Invalid fields after check output segment fields:\nplatform:{}\ndatatype:{}" .format(data._platform, data._datatype.name)) return res bs: bytes = cls._fields_to_bytes(fields, enc) if bs is None or not any(bs): return res res = bs return res except Exception: res = None cls._logger.error( "Output single data segment error:\nplatform:{}\ndatatype:{}\nerror:{}" .format(data._platform, data._datatype.name, traceback.format_exc()))
def _get_mutiple_bs( cls, data: OutputData, datastd: OutputDataConfig, enc: str = "utf-8", maxsegcount: int = 1000, ) -> iter: """输出多段类型数据,返回bytes迭代器""" res: bool = True segcount = 0 segbs: bytes = bytes() try: if not datastd._enable: cls._logger.debug( "Data standard '{}' in platform '{}' is not enabled, data won't output" .format(datastd._datatype.name, datastd.owner._platform)) return res for seg in data.get_output_segs(): try: # 构建输出bytes try: if not isinstance(seg, OutputDataSeg): cls._logger.error( "Invalid OutputDataSeg object: {}".format(seg)) res = False return res seg: OutputDataSeg = seg # 检查输出数据字段有效性 fields = cls._parse_fields(seg, datastd) if not isinstance(fields, dict) or len(fields) < 1: continue bs = cls._fields_to_bytes(fields, enc) if bs is None or not any(bs): continue segbs += bs segcount += 1 except Exception: res = False cls._logger.error( "Check segment fields validation failed:\nplatform:{}\ndatatype:{}\nerror:{}" .format( data._platform, data._datatype.name, traceback.format_exc(), )) if segcount < maxsegcount: continue # 达到segment段落数量上限输出 try: yield segbs except Exception: cls._logger.error( "Output mutiple segments error: {}".format( traceback.format_exc())) finally: segbs = bytes() segcount = 0 except Exception: res = False cls._logger.error( "Check output data segment failed:\nplatform:{}\ndatatype:{}\nerror:{}" .format(data._platform, data._datatype.name, traceback.format_exc())) # 或者遍历所有seg完成时输出 if not segbs is None and any(segbs): yield segbs except Exception: res = False cls._logger.error( "Output mutiple data segment error:\nplatform:{}\ndatatype:{}\nerror:{}" .format(data._platform, data._datatype.name, traceback.format_exc()))