Недопустимые синтаксические выражения

Я пытаюсь распаковать набор телефонных номеров из последовательности, оболочка python, в свою очередь, вызывает недопустимую синтаксическую ошибку. Я использую python 2.7.1. Вот фрагмент

 >>> record = ('Dave', '[email protected]', '773-555-1212', '847-555-1212')
 >>> name, email, *phone-numbers = record
 SyntaxError: invalid syntax
 >>>

Пожалуйста, объясните. Есть ли другой способ сделать то же самое?

Ответ 1

В Python 2 используется специальный синтаксис Python 3.

Синтаксис * для расширенной итеративной распаковки в назначениях недоступен в Python 2.

Смотрите Python 3.0, новый синтаксис и PEP 3132.

Используйте функцию с распаковкой аргументов * splat для моделирования того же поведения в Python 2:

def unpack_three(arg1, arg2, *rest):
    return arg1, arg2, rest

name, email, phone_numbers = unpack_three(*user_record)

или использовать список фрагментов.

Ответ 2

Этот новый синтаксис был представленный в Python 3. Таким образом, это вызовет ошибку в Python 2.

Связанный PEP: PEP 3132 - Extended Iterable Unpacking

name, email, *phone_numbers = user_record

Python 3:

>>> a, b, *c = range(10)
>>> a
0
>>> b
1
>>> c
[2, 3, 4, 5, 6, 7, 8, 9]

Python 2:

>>> a, b, *c = range(10)
  File "<stdin>", line 1
    a,b,*c = range(10)
        ^
SyntaxError: invalid syntax
>>> 

Ответ 3

Эта функциональность доступна только в Python 3, альтернатива:

name, email, phone_numbers = record[0], record[1], record[2:]

Или что-то вроде:

>>> def f(name, email, *phone_numbers):
        return name, email, phone_numbers

>>> f(*record)
('Dave', '[email protected]', ('773-555-1212', '847-555-1212'))

но это довольно хакерский IMO