语法python已加星标表达式无效

时间:2013-05-15 11:17:02

标签: python iterable-unpacking

我试图从一个序列解压缩一组电话号码,python shell反过来会抛出一个无效的语法错误。我正在使用python 2.7.1。这是片段

 >>> record = ('Dave', 'dave@example.com', '773-555-1212', '847-555-1212')
 >>> name, email, *phone-numbers = record
 SyntaxError: invalid syntax
 >>>

请解释一下。有没有其他方法可以做同样的事情?

3 个答案:

答案 0 :(得分:17)

您在Python 2中使用Python 3特定语法。

Python 2中没有用于赋值中的扩展可迭代解包的*语法。

请参阅Python 3.0, new syntaxPEP 3132

使用带有* splat参数解包的函数来模拟Python 2中的相同行为:

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

name, email, phone_numbers = unpack_three(*user_record)

或使用列表切片。

答案 1 :(得分:14)

这个新语法是introduced in 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
>>> 

答案 2 :(得分:7)

该功能仅在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', 'dave@example.com', ('773-555-1212', '847-555-1212'))

但这是非常hacky IMO