Проблема здесь:
accounts = ([self.obj.first_name(), self.obj.last_name()])
На первый взгляд это выглядит как кортеж списков, и единственный список в кортеже имеет два значения. Итак, for first, last in accounts:
должно работать, верно?
Но на самом деле это не кортеж.
Запятые создают кортежи в Python; круглые скобки только для устранения неоднозначности. Значение (2+3)
не является кортежем отдельного элемента 5
, это просто число 5
. Вам нужен 2+3,
(или (2+3,)
), если вы хотите кортеж с этим одним элементом.
И это именно то, что происходит в вашем коде. Без запятой вы просто создаете список [self.obj.first_name(), self.obj.last_name()]
. Когда вы повторяете это, вы не получаете двухэлементный список, вы получаете имя (предположительно строку), поэтому вы фактически делаете first, last = first_name
, что является бессмысленным. 1
Чтобы это исправить, просто добавьте запятую:
accounts = ([self.obj.first_name(), self.obj.last_name()],)
Или вы можете просто использовать список. Вы на самом деле не ищете здесь неизменности (в противном случае у вас будет кортеж кортежей, а не кортежей списков), или для коллекции фиксированного размера, где позиция имеет смысл, или для микрооптимизации (кортеж должен бриться ~ 6% из <100 байт…), и это основные причины использования кортежей вместо списков: </p>
accounts = [[self.obj.first_name(), self.obj.last_name()]]
1. На самом деле, это совершенно законное утверждение, потому что строки повторяемы - они повторяют свои отдельные символы. Но имя, такое как, скажем, 'Balla'
имеет 5 символов, и вы пытаетесь распаковать эти 5 элементов в 2 переменные. Отсюда ошибка ValueError: too many values to unpack (expected 2)
.