12

シーケンスから一連の電話番号をアンパックしようとしていますが、Python シェルが無効な構文エラーをスローします。私はpython 2.7.1を使用しています。ここにスニペットがあります

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

説明してください。同じことを行う他の方法はありますか?

4

3 に答える 3

19

Python 2 で Python 3 固有の構文を使用しています。

*割り当てでの拡張された iterable unpackingの構文は、Python 2 では使用できません。

Python 3.0、新しい構文、およびPEP 3132を参照してください。

*Python 2 で同じ動作をシミュレートするには、splat 引数のアンパッキングで関数を使用します。

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

name, email, phone_numbers = unpack_three(*user_record)

またはリストのスライスを使用します。

于 2013-05-15T11:18:17.110 に答える
14

この新しい構文はPython 3 で導入されました。そのため、Python 2 ではエラーが発生します。

関連する PEP: PEP 3132 -- Extended Iterable Unpacking

name, email, *phone_numbers = user_record

パイソン 3:

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

パイソン 2:

>>> a, b, *c = range(10)
  File "<stdin>", line 1
    a,b,*c = range(10)
        ^
SyntaxError: invalid syntax
>>> 
于 2013-05-15T11:18:09.277 に答える
8

その機能は 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'))

しかし、それはかなりハッキーなIMOです

于 2013-05-15T11:20:11.940 に答える