Автор оригинала: 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 док