1

私は一日の大部分を、代入ステートメントの最後にある漂遊コンマによって引き起こされたバグを見つけるのに費やしました。私のバグを見つけることの難しさは、例外をトラップしていたサードパーティのコールバックライブラリによって悪化しましたが、Python(2.x)がタプルを作成する代わりに構文エラーを発生させないのはなぜか疑問に思いました。次のことを考慮してください

>>> a = 1,
>>> a
(1,)

ご覧のとおり、末尾のコンマはシングルトンタプルを作成します。これはPythonの文法に違反しているわけではありませんが(http://docs.python.org/reference/expressions.html#grammar-token-expression_listを参照)、予期しない結果が生じる可能性があります。

>>> a == 1,
(False,)

vs

>>> (1,) == a
True

私は今何が起こっているのか理解していますが、Pythonがタプルを作成するために明示的な括弧を必要とせずにこの構文を許可する理由に戸惑っています。この振る舞いが必要な場合、または少なくとも有利な場合はありますか? 私は過去7年間、Pythonでほぼ独占的にプログラミングを行っており、この方法でシングルトンを作成する必要はありませんでした。Pythonは、ほとんどの点で、素晴らしく読みやすく、明示的な言語です。この特定の「機能」は、まあ、Pythonicではないようです。

4

3 に答える 3

7

Pythonの作成者であるGuidovanRossumが、この構文がどのようになったかを説明します。

タプルに配列のようなインターフェイスを追加した結果の1つは、長さが0または1のタプルのエッジケースを解決する方法を考え出す必要があったことです。ABCから取得したルールの1つは、印刷時または文字列に変換され、言語のパーサーへの有効な入力である式で表す必要があります。そのため、0レングスと1レングスのタプルの表記が必要になりました。同時に、1タプルと裸の括弧で囲まれた式の区別を失いたくなかったので、末尾のコンマが式を1タプルに変換し、「() "はゼロタプルを表します。Pythonのタプル構文で括弧が通常必要とされないことは何の価値もありません。

TupleSyntaxに関するこのPythonInfoWikiも参照してください。特に、「...タプルを定義するのは括弧ではなくコンマです」。

この構文は美しくはありませんが(Guidoは醜いですが、実用的です)、それは大した問題ではないと思います。本当の落とし穴は、サードパーティのライブラリが「例外をトラップ」していて、エラーに関する重要な情報を隠していたことです。

于 2012-07-23T23:16:28.397 に答える
2

2つの値を交換するという便利な例が1つあります。確かに、ここでは明示的な括弧を使用できますが、括弧がないと見栄えが良くなります。

a, b = b, a
于 2012-07-23T22:16:55.930 に答える
2

申し訳ありませんが、コメントするのに十分な担当者がいないので、これはそれ自身の答えになります。

ここには、関連しているが異なる2つのことがあります。タプルの解凍と、タプルリテラルの作成です。

タプルの解凍は、MarkRansomの回答にあります。

しかし、タプルは人々にとってつまずきのようです。それらは括弧で作成されていません。括弧は曖昧性解消のためにのみ使用されます。コンマはタプルを定義しますa,。1つの要素を持つタプルも同様です。なぜなら、それがタプルであり、コンマを持つものだからです:)。(注意点は、空のタプルの場合、,見た目が醜いというよりも、行き詰まってしまうこと()です。これは、おそらく人々がこれで抱えていると思われる問題の原因です。)

于 2012-07-23T22:52:34.850 に答える