Свой тип данных через дескрипторы Python (генерация тестовых данных)
Доброго времени суток,
Для нужд тестирования потребовалось соорудить генератор данных, беглый поиск подходящего готового решения не выявил, а потому начал клепать свой велик.
Общая идея такая:
class Entity:
# Общие полезности
def get_insert_statement(self):
template = 'INSERT INTO {TABLE} ({FIELDS}) VALUES ({VALUES});'
fields = [f for f in dir(self) if f.startswith('f_')]
values = []
for field in fields:
if isinstance(getattr(self, field), VarcharField):
values.append('\'' + getattr(self, field) + '\'')
return template.format(**{'TABLE': self.table,
'FIELDS': ','.join([f[2:] for f in fields]),
'VALUES': ','.join(values)})
class VarcharField:
def __init__(self, init_value=None):
self._data = init_value
def __get__(self, instance, owner):
return self._data
def __set__(self, instance, value):
self._data = str(value)
class Employee(Entity):
table = 'EMPLOYEE'
f_employee_id = VarcharField()
if __name__ == '__main__':
emp = Employee()
emp.f_employee_id = '12345'
print(emp.get_insert_statement())
Столкнулся с тем, что isinstance(getattr(self, field), VarcharField) работает не так как ожидал, а именно тип поля равен типу возвращаемого __get__ значения, а не типу-дескриптору. По сути все данные будут представленны строками(в том числе числа и даты), свои же типы нужны для правильной обвязки значений в выходных форматах.
Хотелось бы получить совет - какие еще возможны подходы(попробовал тип-класс с get/set методами - довольно громоздко использовать, также рассматриваю вариант генерить имена полей с префиксом отражающим тип, например f_v[archar]_employee_id)
P.S. Готовые ORM не брал, так как все они предназначены скорее именно для работы с БД, мне же нужно именно генерировать наборы данных(в том числе и не корректных, типа строк в числовом типе) с дальнейшей сериализацией в тектовые файлы/sql/бинарные форматы.