Именованные кортежи в Python — это очень простая, но интересная функция, которая может облегчить жизнь разработчику. Они являются частью модуля collections
и действуют очень похоже на обычные кортежи, с той лишь разницей, что к значениям, хранящимся в именованном кортеже, можно обращаться не по индексам, а по именам полей.
Например, точка в двумерной плоскости может быть представлена с помощью двух координат. В обычном кортеже доступ к этим значениям осуществляется по индексу ([0]
и [1]
), но если мы определим именованный кортеж, Point
, мы сможем обращаться к ним, используя x
и y
(хотя при желании мы можем использовать и индексы):
from collections import namedtuple
# Regular tuple
p = (2, 4) # p[0] = 2, p[1] = 4
# Named tuple
Point = namedtuple('Point', 'x y')
q = Point(3, 5) # q.x = 3, q.y = 5
Помимо повышения удобочитаемости вашего кода, именованные кортежи обеспечивают еще несколько улучшений качества жизни. Прежде всего, они позволяют задавать значения по умолчанию через аргумент итерабельной переменной defaults
. Во-вторых, они имеют возможность автоматически переименовывать дублирующиеся или недействительные поля с помощью булевого аргумента rename
. И, наконец, они даже предоставляют удобную возможность задавать имена полей в виде списка или строки, разделенной запятыми/пробелами.
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y', 'z'], defaults = [1]);
a = Point(1, 1, 0); # a.x = 1, a.y = 1, a.z = 0
# Default value used for `z`
b = Point(2, 2); # b.x = 2, b.y = 2, b.z = 1 (default)
Где же подвох? спросите вы. Похоже, что его нет! Очевидная параллель со словарями в плане синтаксиса, похоже, не проходит дальше, так как экземпляры именованных кортежей не имеют словарей на экземпляр, а это значит, что они требуют столько же памяти, сколько и обычные кортежи.
Вам нравятся короткие, качественные фрагменты кода и статьи? Мы тоже! Посетите сайт 30 seconds of code, чтобы найти больше статей, подобных этой, или следите за нами в Twitter, чтобы получать ежедневные фрагменты JavaScript, React и Python! 👨💻