dataclass + Schema&parser

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from typing import Optional
from dataclasses import dataclass
from dataclass_factory import Schema, Factory
from datetime import datetime
from typing import List
@dataclass
class Station:
'''
Класс для тестирования dataclass
4 поля к классе:
name: Наименование станции
serial_num: серийный номер модема
rx_controller: ID контроллера rx
lost_up_date: Дата последнего обновления
'''
name: str
serial_num: str
rx_controller: str
lost_up_date: Optional[datetime]
def convert_data(data):
'''
Проверка и конвертация даты в datetime
:param data: Дата в формате %Y-%m-%d %H:%M:%S
:return: Дата или None если на месте цифр стоят все нули
если дата не корректна - генерируется исключение ValueError
'''
if data == '0000-00-00 00:00:00':
return None
return datetime.strptime(data, '%Y-%m-%d %H:%M:%S')
def serializer(data):
'''
Серилизация данных для предстваления в видк dump
преобразует данные в стоку
:param data:
:return: строка в виде
'''
if data is None:
return '0000-00-00 00:00:00'
return data.strftime('%Y-%m-%d %H:%M:%S')
# Схема фабрики
schema = Schema(parser=convert_data, serializer=serializer)
# Фабрика
factory = Factory(schemas={Optional[datetime]: schema}, debug_path=False)
# Данные
stations = factory.load([
{
'name': '0000_00000002',
'serial_num': '00000002',
'rx_controller': '202',
'lost_up_date': '2019-09-18 10:02:10',
'tftp_vlan': 0,
'mon_lanrx_val': 2,
'mon_lantx_val': '0',
'mon_backup_enable': '0',
'mon_backup_ip': '0.0.0.0'
},
{
'name': '0000_00000001',
'serial_num': '00000001',
'rx_controller': '202',
'lost_up_date': '0000-00-00 00:00:00'
}]
, List[Station])
for i in stations:
# Печать элемента класса
print(f'Элемент:\t{i}')
# Печать элемента класса в виде dict
print(f'Словарь:\t{factory.dump(i)}')
'''
Элемент: Station(name='0000_00000002', serial_num='00000002', rx_controller='202', lost_up_date=datetime.datetime(2019, 9, 18, 10, 10, 10))
Словарь: {'name': '0000_00000002', 'lost_up_date': '2019-09-18 10:10:10', 'serial_num': '00000002', 'rx_controller': '202'}
Элемент: Station(name='0000_00000001', serial_num='00000001', rx_controller='202', lost_up_date=None)
Словарь: {'name': '0000_00000001', 'lost_up_date': '0000-00-00 00:00:00', 'serial_num': '00000001', 'rx_controller': '202'}
'''