Автор оригинала: Pankaj Kumar.
Объект Python NamedTuple является частью модуля коллекций. Python NameDTuple – это расширение кортежа.
Python NamedTuple.
- Python NameDTuple неизменен, как кортеж.
- NamedTuple позволяет нам предоставлять имена элементам. Таким образом, мы можем получить доступ к элементам как по значению индекса, либо по имени.
- Python NameDTuple помогает нам в писать лучший читаемый код. Если кортеж имеет много значений, использование индекса становится запутанным. С NamedTuple мы можем предоставить описательные имена на полях.
- Имена поля Python NamedTuple могут быть любым действительным идентификатором Python. Допустимые идентификаторы состоят из букв, цифр и подчеркиваний, но не начинаются с подчеркивания или цифры. Кроме того, мы не можем использовать ключевые слова, такие как Класс , для , Деф, возвращение, глобальный, пройти или поднять и т. Д.
- Мы можем указать значения по умолчанию к параметрам NamedTuple, используя
по умолчаниюПараметр при определении namedTuple. Обратите внимание, что эта функция была добавлена в Python 3.7. - Экземпляры Python NamedTuple не имеют словарей для каждого экземпляра, поэтому они легки и требуют большего количества памяти, чем обычные кортежи.
Быстрая пересмотр к кортежу
Прежде чем начать с примеров NamedTuple, давайте быстро посмотрим на Python Tupple. Мы создадим несколько кортежей и распечатаваем их значения для консоли.
emp1 = ('Pankaj', 35, 'Editor')
emp2 = ('David', 40, 'Author')
for p in [emp1, emp2]:
print(p)
for p in [emp1, emp2]:
print(p[0], 'is a', p[1], 'years old working as', p[2])
# pythonic way
for p in [emp1, emp2]:
print('%s is a %d years old working as %s' % p)
Выход:
('Pankaj', 35, 'Editor')
('David', 40, 'Author')
Pankaj is a 35 years old working as Editor
David is a 40 years old working as Author
Pankaj is a 35 years old working as Editor
David is a 40 years old working as Author
Обратите внимание, что мы используем индексы для извлечения элементов кортежа.
Пример Python NamedTuple
Python NamedTuple создан с использованием фабричного метода из модуля коллекций. Эта подпись функций выглядит следующим образом:
collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
TypEname: Это название объекта NamedTuple.field_names: Это второй аргумент, чтобы определить имена поля в NameDTuple. Мы можем определить их, используя следующие форматы –«Имя возрастной роли»,«Имя, возраст, роль»или[«Имя», «возраст», «роль»]ОтказПереименовать: Мы можем указать переименование true, так что неверные поля переименовываются в их указательные имена. Например,«Имя деф класс»будет переименован в«Имя», «_1», «_2»Отказпо умолчанию: Он используется для определения значений по умолчанию к необязательным параметрам. Поскольку поля с значением по умолчанию должны поступать после любых полей без по умолчанию, значения по умолчанию применяются к главным параметрам. Например, если поля поля[«А», «B», «C»]ипо умолчаниюЕсть (1, 2), то «A» будет необходимым аргументом, «B» будет по умолчанию 1, а «C» будет по умолчанию 2.модуль: Если модуль определен,__module__Атрибут названного кортежа устанавливается на это значение. Этот параметр был представлен в выпуске Python 3.6.
Давайте посмотрим простой пример для создания NamedTuple и распечатайте его значения.
from collections import namedtuple
Employee = namedtuple('Employee', ['name', 'age', 'role'])
# below are also valid ways to namedtuple
# Employee = namedtuple('Employee', 'name age role')
# Employee = namedtuple('Employee', 'name,age,role')
emp1 = Employee('Pankaj', 35, 'Editor')
emp2 = Employee(name='David', age=40, role='Author')
for p in [emp1, emp2]:
print(p)
# accessing via index value
for p in [emp1, emp2]:
print('%s is a %d years old working as %s' % p)
# accessing via name of the field
for p in [emp1, emp2]:
print(p.name, 'is a', p.age, 'years old working as', p.role)
Обратите внимание, что я использую имена имени NamedTuple, чтобы получить значения. Более или менее он почти такой же, как и предыдущий пример кортежа.
Выход:
Employee(name='Pankaj', age=35, role='Editor') Employee(name='David', age=40, role='Author') Pankaj is a 35 years old working as Editor David is a 40 years old working as Author Pankaj is a 35 years old working as Editor David is a 40 years old working as Author
Python NamedTuple с неверными ключами и переименовать
Если мы используем неверные ключи для имена имени имени, то мы получим ValueError Отказ
try:
Person = namedtuple('Person', 'def class')
except ValueError as error:
print(error)
Выход:
Type names and field names cannot be a keyword: 'def'
Теперь давайте посмотрим, что произойдет, когда мы укажем переименовать как True.
# rename=True will rename invalid names to index value with underscore prefix
Person = namedtuple('Person', 'name def class', rename=True)
print(Person._fields)
Выход:
('name', '_1', '_2')
Обратите внимание, что имена поля изменены на их значения индекса, префиксированные подчеркиванием.
Python NamedTuple модуль
# namedtuple module parameter - introduced in 3.6
Person = namedtuple('Person', 'name', module='MyPersonModule')
print(Person.__module__)
Выход:
MyPersonModule
Python NamedTuple Дополнительные методы
Давайте посмотрим на три дополнительных метода, доступными для NameDTuple.
_make (утеряемый)
Этот класс Method может быть использован для создания NamedTuple из намека.
t = ('Lisa', 35, 'Contributor')
emp3 = Employee._make(t)
print(emp3)
Выход:
Employee(name='Lisa', age=35, role='Contributor')
_asdict ()
Это используется для создания экземпляра упорядоченности от имени NamedTuple.
od = emp3._asdict() print(od)
Выход:
OrderedDict([('name', 'Lisa'), ('age', 35), ('role', 'Contributor')])
_replace (** kwargs)
Python NamedTuple неизменен, поэтому мы не можем изменить его значения. Этот метод возвращает новый экземпляр NamedTuple, заменяя указанные поля новыми значениями.
emp3 = emp3._replace(name='Lisa Tamaki', age=40) print(emp3)
Выход:
Employee(name='Lisa Tamaki', age=40, role='Contributor')
Python NamedTuple Дополнительные атрибуты
В NamedTuple есть два дополнительных параметра – _Fields и _fields_defaults Отказ Как следует из названия, они предоставляют информацию о полях и их значениях по умолчанию. Python 3.7 Droped _Source Атрибут Отказ
print(emp3._fields)
Gender = namedtuple('Gender', 'gender')
Person = namedtuple('Person', Employee._fields + Gender._fields)
print(Person._fields)
# _fields_defaults - introduced in Python 3.7
# Python 3.7 removed verbose parameter and _source attribute
Person1 = namedtuple('Person1', ['name', 'age'], defaults=['Pankaj', 20])
print(Person1._fields_defaults)
Выход:
('name', 'age', 'role')
('name', 'age', 'role', 'gender')
{'name': 'Pankaj', 'age': 20}
Python NamedTuple разные примеры
Давайте посмотрим на некоторые разные примеры NamedTuple.
getattr ()
Мы можем получить значение поля NamedTuple, используя функцию Getattr ().
emp3_name = getattr(emp3, 'name') print(emp3_name)
Выход:
Lisa Tamaki
Диктовать на название кортежа
Названный кортеж и Dict очень похожи, поэтому неудивительно, что есть быстрый способ конвертировать Dict DictTuple.
d = {'age': 10, 'name': 'pankaj', 'role':'CEO'}
emp4 = Employee(**d)
print(d)
print(emp4)
Выход:
{'age': 10, 'name': 'pankaj', 'role': 'CEO'}
Employee(name='pankaj', age=10, role='CEO')
Резюме
Python NamedTuple полезен в написании лучшего кода с более читаемостью. Это очень легкий, как кортель, поэтому используйте его, когда найдут кортежи смущены из-за использования числовых индексов.
Ссылка: API док