Именованные кортежи определяют имена для каждой позиции в кортеже и позволяют создавать более читаемый и понятный код. Они могут быть использованы в тех же случаях, что и обычные кортежи, а обращаться к полям можно не только по индексу, но и по имени.
- collections.namedtuple(typename, field_names, verbose=False, rename=False)
- Возвращает новый подкласс кортежа с именем typename. Новый подкласс используется для создания кортежеподобных объектов, поля которых доступны как для просмотра через атрибуты, так и для индексации и итерации. Экземпляры этого подкласса так же содержат строку документации (с именем типа и именами полей) и полезный метод __repr__(),который отображает содержимое кортежа в форме name=value.
field_names - одна строка, где каждое имя поля отделено от другого пробелами и/или запятыми, например 'x y' or 'x, y'. Кроме того, в этом параметре можно передать последовательность строк ['x', 'y'].Любые корректные идентификаторы Python могут использоваться в качестве имён полей, за исключением имён, начинающихся с нижнего подчёркивания. Корректные идентификаторы состоят из букв, цифр и нижних подчёркиваний, но не начинается с цифры или нижнего подчёркивания, а так же не может совпадать с одним из keyword например class, for, return, global, pass, или raise.Если rename=true, некорректные имена полей автоматически заменяются позиционными именами, например ['abc', 'def', 'ghi', 'abc'] будет преобразовано в ['abc', '_1', 'ghi', '_3'], заменив ключевое слово def и повторяющееся имя поля abc.Если verbose = true, определение класса будет напечатано после того, как класс будет создан. Эта опция устаревшая, вместо неё проще распечатать атрибут _source.Экземпляры именованного кортежа не имеют своего личного словаря, так что они занимают не больше места, чем обычные кортежи..Изменения в версии 3.1: Добавлена поддержка метода rename.
Именованные кортежи особенно полезны для задания имён полей кортежей, возвращаемых модулями csv или sqlite3:
В дополнение к методам, унаследованным от кортежей, именованные кортежи поддерживают три дополнительных метода и два атрибута. Для того, чтобы предотвратить конфликты с именами полей, эти методы и атрибуты начинаются с нижних подчёркиваний.
- classmethod somenamedtuple._make(iterable)
- Метод класса, который создаёт новый экземпляр из существующей последовательности или итератора.
- somenamedtuple._asdict()
- Возвращает новый OrderedDict который отображает имена полей на соответствующие значения. Обратите внимание, что этот метод уже не требуется, так как тот же самый эффект может быть достигнут при помощи встроенной функции vars():
- somenamedtuple._replace(kwargs)
- Возвращает новый экземпляр именованного кортежа, заменяя определённые пля новыми значениями:
- somenamedtuple._source
- Строка с исходным кодом Python, используемым для создания класса именованного кортежа. Этот код позволяет легко получить документацию для именованного кортежа. Его можно вывести на экран, выполнить при помощи exec(), или сохранить в файл и импортировать.Добавлено в версии 3.3.
- somenamedtuple._fields
- Кортеж строк с именами полей. Полезен для интроспекции и для создания новых типов именованных кортежей из уже существующих.
Чтобы получить значения полей, чьи имена сохранены как строки, используйте функцию getattr():
Что преобразовать словарь в именованный кортеж используйте операцию распаковывания словаря (как описано в Unpacking Argument Lists):
Так как именованный кортеж - это обычный класс Python, к нему легко добавлять новую функциональность или изменить уже существующую, просто создавая его подклассы. Тут показано как добавить подсчитываемое поле и изменить формат отображения класса:
Подкласс, показанный выше, устанавливает атрибут __slots__ в пустой кортеж. Это помогает сократить использование памяти, не допуская создавать словари для экземпляров.
Подклассы не очень полезны для добавления новых полей. Вместо этого, лучше создать новый тип именованного кортежа, используя атрибут _fields имеющегося:
Значения по умолчанию можно реализовать используя метод _replace() для настройки экземпляра прототипа
Перечисляемые константы можно задать при помощи именованного кортежа, но проще сделать это используя простой класс:
См также
- Именованные кортежи для Python 2.4.
- Абстрактный базовый класс именованного кортежа с примешиваемым метаклассом от Jan Kaliszewski. Помимо предоставления абстрактного базового класса для именованных кортежей, он так же поддерживает альтернативный конструктор, основанный на метаклассе.
Комментариев нет:
Отправить комментарий