Invalid syntax python starred expressions

2019-01-24 05:22发布

I am trying to unpack set of phone numbers from a sequence, python shell in turn throws an invalid syntax error. I am using python 2.7.1. Here is the snippet

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

Please explain. Is there any other way of doing the same?

3条回答
【Aperson】
2楼-- · 2019-01-24 05:41

That functionality is only available in Python 3, an alternative is:

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

Or something like:

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

>>> f(*record)
('Dave', 'dave@example.com', ('773-555-1212', '847-555-1212'))

but that is pretty hacky IMO

查看更多
Fickle 薄情
3楼-- · 2019-01-24 05:45

This new syntax was introduced in Python 3. So, it'll raise error in Python 2.

Related 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
>>> 
查看更多
等我变得足够好
4楼-- · 2019-01-24 05:53

You are using Python 3 specific syntax in Python 2.

The * syntax for extended iterable unpacking in assignments is not available in Python 2.

See Python 3.0, new syntax and PEP 3132.

Use a function with * splat argument unpacking to simulate the same behaviour in Python 2:

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

name, email, phone_numbers = unpack_three(*user_record)

or use list slicing.

查看更多
登录 后发表回答