@dataclass class CounterData: counter_id: str period_start: datetime period_end: datetime counter_name: str = "" enter_count: int = 0 exit_count: int = 0 class SensorData: def __init__(self, sensor_type: str, sensor_serial: str, counter_data: list[CounterData], sensor_name: str = ""): self.sensor_serial = sensor_serial self.sensor_name = sensor_name self.sensor_type = sensor_type self.counters = counter_data def __str__(self): txt = f'SensorType={self.sensor_type}, SerialNumber={self.sensor_serial}, SensorName={self.sensor_name}' if len(self.counters) == 0: txt += '\t No counters data.' else: for counter in self.counters: txt += f'\n\tcounter_id={counter.counter_id}, counter_name={counter.counter_name}' \ f'\n\t\tperiod= {counter.period_start} - {counter.period_end}' \ f'\n\t\tentered= {counter.enter_count} exited= {counter.exit_count}' return txt def add_counter_data(self, counter_data: CounterData): self.counters.append(counter_data)
Далее есть функция:
def parse_xml(file_name_full: str) -> SensorData | None: try: xml_tree = ElementTree.parse(file_name_full) except ElementTree.ParseError as err: print(repr(err)) return None xml_root = xml_tree.getroot() namespace = {'ns': 'http://www.tralivali.com/api/v2'} s_type = '3Dv2' s_serial = xml_root.find('ns:sensor-info/ns:serial-number', namespace).text if not s_serial: return None s_name = file_name_full sensor_data = SensorData(sensor_serial=s_serial, sensor_name=s_name, sensor_type=s_type) count_lines = xml_root.findall('ns:content/ns:elements/ns:element', namespace) for count_line in count_lines: line_measurements = count_line.findall('ns:measurements/ns:measurement', namespace) for measurement in line_measurements: enter_count = int(measurement.find("ns:values/ns:value[@label='fw']", namespace).text) exit_count = int(measurement.find("ns:values/ns:value[@label='fw']", namespace).text) line_count_data = CounterData( counter_id=count_line.find("ns:element-id", namespace).text, period_start=datetime.fromisoformat(count_line.find("ns:from", namespace).text), period_end=datetime.fromisoformat(count_line.find("ns:to", namespace).text), counter_name=count_line.find("ns:element-name", namespace).text, enter_count=enter_count, exit_count=exit_count ) sensor_data.add_counter_data(line_count_data) if len(sensor_data.counters) == 0: return None else: return sensor_data
... sensor_count_data: Optional[SensorData] = parse_xml(file_name_full) ...
Объясните, пож-та, кто-нибудь почему в объекте sensor_count_data: Optional = parse_xml(file_name_full) поле списка counters (тип CounterData) с каждой итериацией не очищается, а пополняется всен время новыми данными? Внутри функции parse_xml, объект sensor_data же локально создается для передачи данных обратно в место вызова, и по идее каждый вызов этой функции должен же приводить к созданию нового экземпляра, пустого от прежних значений?
Такое ощущение, что объект в строке кода:
line_count_data = CounterData(.....