Можно ли обмениваться кортежами между модулями Python? - PullRequest
1 голос
/ 06 июля 2010

У меня есть небольшая программа на Python, состоящая из очень немногих модулей (около 4 или около того).Основной модуль создает список кортежей, тем самым представляя ряд записей.Эти кортежи доступны другим модулям через простую функцию, которая их возвращает (скажем, get_records()).

Однако я не уверен, что это хороший дизайн.Проблема в том, что другие модули должны знать индексы каждого элемента в кортеже.Это увеличивает связь между модулями и не очень прозрачно для тех, кто хочет использовать основной модуль.

Я могу подумать о нескольких альтернативах:

  1. Сделать значения индекса элементов кортежа доступными как константы модуля (например, IDX_RECORD_TITLE, IDX_RECORD_STARTDATE и т. Д.).Это исключает необходимость использования магических чисел, таких как title = record[3].

  2. Не используйте кортежи, но создайте класс записи и верните список этих объектов класса.Преимущество заключается в том, что методы класса будут иметь самоочевидные имена, такие как record.get_title().

  3. Не используйте кортежи, а словари.Таким образом, в этом случае функция будет возвращать список словарей.Преимущество заключается в том, что словарные ключи также говорят сами за себя (хотя кто-то, использующий модуль, должен был бы их знать).Но это похоже на огромные издержки.

Я считаю, что кортежи являются одной из сильных сторон Python (очень легко передавать составные данные без затрат на кодирование классов / объектов),поэтому я в настоящее время использую (1), но все еще задаюсь вопросом, что будет лучшим подходом.

Ответы [ 3 ]

5 голосов
4 голосов
/ 06 июля 2010

я не вижу никаких издержек или сложности при передаче объектов через кортежи (кортежи также являются объектами)

IMO, если кортеж служит вашим целям, легко используйте его, но, как вы видели, ограничения просто переключаются на класс, который четко представляет ваши данные, например

class MyData(object):
    def __init__(self, title, desc):
        self.title = title
        self.desc = desc

Вам не нужно добавлять какой-либо метод получения или установки.

0 голосов
/ 06 июля 2010

В этих случаях я склонен использовать словари.Если бы у меня были вещи, которые легко понять, когда я вернусь немного позже, чтобы использовать код.

Я не знаю, огромные ли это накладные расходы.Я думаю, это зависит от того, как часто вы делаете это и для чего это используется.Я начинаю с самого простого решения и оптимизирую, когда мне действительно нужно.К удивлению, мне редко приходится что-то менять.

...