Что является аналогом Python для структурного типа Ada record / C ++? - PullRequest
3 голосов
/ 09 июня 2011

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

Большая часть моего опыта программиста связана с вариантами Ada или C / C ++.В Ada я бы использовал тип записи и совокупное назначение, чтобы при обновлении типа записи новыми полями компилятор уведомлял любого, кто использует эту запись.В C ++, скорее всего, я бы использовал класс хранения и конструктор, чтобы сделать что-то подобное.

Каким образом можно разрешить подобную ситуацию в Python?Это тот случай, когда классы - правильный ответ, или есть более легкий вес аналога записи Ады?

Дополнительная мысль: и записи Ada, и конструкторы C ++ допускают значения инициализации по умолчанию.Есть ли решение Python для вышеуказанного вопроса, который также предоставляет эту возможность?

Ответы [ 2 ]

5 голосов
/ 09 июня 2011

A namedtuple (из библиотеки коллекций) может соответствовать вашим целям.Это в основном кортеж, который позволяет ссылаться на поля по имени, а также по позиции индекса.Так что это фиксированная структура упорядоченных именованных полей.Он также облегчен тем, что использует slots для определения имен полей, что исключает необходимость носить словарь в каждом случае.

Типичным вариантом использования является определение точки:

from collections import namedtuple
Point = namedtuple("Point", "x y")
p1 = Point(x=11, y=22)

Его главный недостаток в том, что, будучи кортежем, он неизменен.Но есть метод replace, который позволяет заменить одно или несколько полей новыми значениями, но в процессе создается новый экземпляр.

Существует также изменяемая версия namedtuple, доступная в ActiveState Python Recipes 576555, называемая records , которая разрешает прямые изменения полей.Я использовал его и могу подтвердить, что он хорошо работает.

3 голосов
/ 09 июня 2011

Словарь - это классический способ сделать это на Python. Он не может принудительно установить, что значение должно существовать, и не имеет начальных значений.

config = {'maxusers': 20, 'port': 2345, 'quota': 20480000}

collections.namedtuple() - это еще один вариант в версиях Python, которые его поддерживают.

...