class Table:
    def __init__(self, meta, tups):
        self._validate_data(meta, tups)  # валидация введенных данных
        self.meta = list(meta)
        self.tables = list(tups)

    def _validate_data(self, meta, tups):
        '''Валидация данных'''
        if len(meta) != len(tups[0]):
            raise ValueError('Meta header and tuples lengths dont match!')
        if not all(len(tups[0]) == len(x) for x in tups):
            raise ValueError('All tuples must be the same length!')

    def _find_lengths(self):
        '''Поиск максимальной длины каждой колонки. Вспомогательная функция'''
        result = [0 for _ in range(len(self.tables[0]))]
        merged = [self.meta] + self.tables
        for i in range(len(merged[0])):
            for row in merged:
                if len(str(row[i])) > result[i]:
                    result[i] = len(str(row[i]))
        return result

    def _draw_border(self):
        ''' "Рисует" рамку таблицы '''
        rows = ['' for _ in range((len(self.tables)+1)*2+1)]
        lengths = self._find_lengths()
        for i in range(len(rows)):
            if i % 2 == 0:  # если строка четная, значит там очертания рамки
                rows[i] = '+'
                for num in lengths:
                    rows[i] += '-'*num + '--+'
            else:  # если нечетная, значит там будут данные
                rows[i] = '|'
                for num in lengths:
                    rows[i] += ' '*num + '  |'
        return rows  # возвращаем список строк таблицы

    def draw_table(self):
        '''Рисует таблицу целиком'''
        from itertools import count
        merged = [self.meta] + self.tables
        table = self._draw_border()  # подготавливаем рамку заранее
        lengths = self._find_lengths()  # нужно, чтобы знать максимальную длину каждой колонки
        for i, idx in zip(range(1, len(table), 2), count()):  # итерация по индексам списка table и индексам списка merged
            result = '|'
            for j, elem in enumerate(merged[idx]):
                extra_l = (lengths[j] - len(str(elem))) // 2
                extra_r = extra_l+1 if (lengths[j] - len(str(elem))) % 2 != 0 else extra_l
                result += ' ' + ' '*extra_l + str(elem) + ' '*extra_r + ' |'
            table[i] = result
        print('\n'.join(table))


if __name__ == '__main__':
    meta = ['id', 'name', 'description', 'count']
    tups = [
        (1, 'tomato', 'shit', '2000'),
        (24, 'pineapple', 'good', '13000'),
        (7, 'watermelon', 'eatable', '600')
    ]
    t = Table(meta, tups)
    t.draw_table()