Стандартная библиотека Python имеет удобную заводскую функцию коллекции под названием NALITTUPLE , который можно использовать для назначения имен для каждой позиции в кортеже.
Названные кортежи ведут себя как обычные кортежи, но у каждого элемента есть имя, которое можно использовать для извлечения значения, как и с объектами класса.
from collections import namedtuple Item = namedtuple("Item", ["name", "price", "quantity"])
Здесь мы впервые импортируем natingtuple
из Коллекции
Модуль в стандартной библиотеке, а затем создайте названный кортеж под названием Пункт
со свойствами имя
, цена
и количество
Анкет
Теперь мы можем создавать объекты типа Пункт
То же самое Если Пункт
были классом.
ketchup = Item(name="Ketchup", price=1.00, quantity=10000)
Мы также можем получить доступ к свойствам, как и следовало ожидать.
>>> ketchup.price 1.0 >>> ketchup.quantity 10000 >>> toilet_paper.name 'Ketchup'
Все свойства, которые мы определили для Пункт
требуются, поэтому, если вы попытаетесь создать объект без количество
Мы получим ошибку.
>>> mustard = Item(name="Mustard", price=1.00) Traceback (most recent call last): File "", line 1, in TypeError: __new__() missing 1 required positional argument: 'quantity' >>>
Однако мы можем передать список значений по умолчанию при создании названного корпуса.
Item = namedtuple("Item", ["name", "price", "quantity", "is_dairy"], defaults=[False])
Значения по умолчанию применяются справа налево, поэтому здесь is_dairy
по умолчанию Ложный
Анкет Свойства со значениями по умолчанию, следовательно, должны быть определены после свойств с необходимыми значениями.
Поскольку кортежи неизменны, мы не можем изменить значения с помощью простого назначения.
>>> ketchup.price = 2.00 Traceback (most recent call last): File "", line 1, in AttributeError: can't set attribute >>>
Но названные кортежи предоставляют нам _replace
Метод, который мы можем использовать для изменения значений.
>>> ketchup._replace(price=2.00) Item(price=2.0, quantity=10000, name='Ketchup') >>>
Для инициализации именованного корпуса мы также можем использовать _make
Метод, который принимает в качестве ввода итерабильный. Это означает, что мы можем Инициализируйте наш названный кортеж из списка , стандартный кортеж или любой другой объект, который реализует Протокол итератора Python
>>> pepper = Item._make(["Pepper", 1.00, 1]) >>> pepper Item(price='Pepper', quantity=1.0, name=1) >>>
Документация Python имеет Отличный пример Использования _make
Для инициализации именованных кортежей при чтении данных из базы данных SQLite или при чтении файла CSV.
Названные кортежи могут быть легко преобразовано в словарные и наоборот, используя _asdict
Метод и Двойной звездный оператор
>>> ketchup._asdict() {'name': 'Ketchup', 'price': 1.0, 'quantity': 10000, 'is_dairy': False} >>> >>> mustard_dict = {"name": "Mustard", "price": 1.00, "quantity": 10} >>> mustard = Item(**mustard_dict) >>> mustard Item(price=1.0, quantity=10, name='Mustard') >>>
Обратите внимание, что с Python 3.8, _asdict
Возвращает регулярный дикта
Потому что они теперь также упорядочены (с момента Python 3.7).
Мы можем получить доступ к имени поля и значения по умолчанию программно, используя _fields
и _field_defaults
характеристики.
>>> ketchup._fields ('name', 'price', 'quantity', 'is_dairy') >>> ketchup._field_defaults {'is_dairy': False} >>>
Для получения дополнительной информации о названных кортежах вы должны проверить Документация Python.
Оригинал: “https://dev.to/juhanakristian/using-namedtuple-to-create-simple-data-objects-in-python-1j54”