タプル定義に末尾のコンマを含めるための構文規則は何ですか?


119

単一要素のタプルの場合、末尾のコンマが必要です。

a = ('foo',)

複数の要素を持つタプルはどうですか?末尾のコンマが存在するかどうかにかかわらず、どちらも有効であるようです。これは正しいです?私の意見では、末尾にコンマを付けると編集しやすくなります。それは悪いコーディングスタイルですか?

a = ('foo1', 'foo2')
b = ('foo1', 'foo2',)

回答:


73

空のタプルを除くすべてのケースで、コンマが重要です。括弧は、タプルを関数の引数のセットや演算子の優先順位と区別したり、改行を許可したりするなど、他の構文上の理由で必要な場合にのみ必要です。

タプル、リスト、または関数の引数の末尾のコンマは、特に、複数の行に分割される長い初期化がある場合に適しています。常に末尾にコンマを含める場合は、別の要素を追加することを期待して最後に別の行を追加せず、代わりに有効な式を作成します。

a = [
   "a",
   "b"
   "c"
]

後で拡張された2要素のリストとして開始されたと仮定すると、おそらくすぐには明らかではない方法で問題が発生しています。常に末尾のコンマを含めると、そのトラップを回避できます。


3
上記の理由から、カンマを残しておくと便利です。一方、JavaScriptまたはJSONをアプリケーションの他の場所でも処理している場合、一部のブラウザーはJavaScriptを好まないため、この習慣を採用すると頭痛の種になる可能性があります。
Cito

7
はい。ただし、JSONを手動で作成することは問題ではありません。JavaScriptの場合、JavaScriptは常にjslintまたは同等のものを使用して、ブラウザに近づく前にこの種のエラーをキャッチします。
ダンカン

100

単一項目のタプルが、タプルまたは括弧で囲まれた式の定義を明確にすることのみが必要です。

(1)  # the number 1 (the parentheses are wrapping the expression `1`)
(1,) # a 1-tuple holding a number 1

複数のアイテムの場合、それがタプルであることは完全に明らかであるため、不要になりました。ただし、末尾のコンマを使用すると、複数行を使用してそれらを簡単に定義できます。誤ってコンマを省略したため、構文を壊すことなく、最後に項目を追加したり、項目を再配置したりできます。

例えば、

someBigTuple = (
                   0,
                   1,
                   2,
                   3,
                   4,
                   5,
                   6,
                   7,
                   8,
                   9,
                   10,
                   #...
                   10000000000,
               )

これはタプルだけでなく、他のコレクション(リストや辞書など)にも適用されることに注意してください。


5
これはタプル以外のものにも有効であることを指摘するための+1。これはkey: value,1行に1つ持つのに非常に便利で、新しいものを追加するときにカンマを処理しません。
ジョエル

46

末尾のコンマのもう1つの利点は、diffをより見やすくすることです。あなたが始めた場合

a = [
    1,
    2,
    3
]

そしてそれを

a = [
    1,
    2,
    3,
    4
]

差分は次のようになります

 a = [
     1,
     2,
-    3
+    3,
+    4
 ]

一方、末尾のコンマで始めた場合、

a = [
    1,
    2,
    3,
]

次に、差分は単に

 a = [
     1,
     2,
     3,
+    4,
 ]

これは実際には元の質問に対する回答というよりはコメントですが、末尾のコンマを優先して、追加の引数が本当に好きです。
マッド物理学者


8

また、必要な状況を考慮してください。

>>> (('x','y'))*4                         # same as ('x','y')*4
('x', 'y', 'x', 'y', 'x', 'y', 'x', 'y')
#Expected = (('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))

したがって、この場合、外側の括弧はグループ化括弧にすぎません。それらをタプルにするには、末尾にコンマを追加する必要があります。すなわち

>>> (('x','y'),)*4 
(('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))

6

末尾のコンマは、1要素のタプルにのみ必要です。大きなタプルの末尾にコンマを付けることはスタイルの問題であり、必須ではありません。その最大の利点は、頻繁に変更される複数行の大きなタプル(構成タプルなど)を持つファイルのdiffをクリーンにすることです。


6

それは簡単な答えです。

a =( "s")は文字列です

そして

a =( "s"、)は1つの要素を持つタプルです。

Pythonでは、1つの要素のタプルの場合、文字列とタプルを区別するために追加のコンマが必要です。

たとえば、Pythonコンソールでこれを試してください:

a =( "s")

a = a +(1,2,3)

トレースバック(最新の呼び出しが最後):

モジュールのファイルstdin、1行目

TypeError: 'str'および 'tuple'オブジェクトを連結できません


4

これが存在するもう1つの理由は、コードの生成と__repr__関数の記述が容易になることです。あなたのように構築されたいくつかのオブジェクトを持っている場合たとえば、obj(arg1, arg2, ..., argn)、その後、あなただけ書くことができますobj.__repr__ように

def __repr__(self):
    l = ['obj(']
    for arg in obj.args: # Suppose obj.args == (arg1, arg2, ..., argn)
        l.append(repr(arg))
        l.append(', ')
    l.append(')')
    return ''.join(l)

末尾のコンマが許可されていない場合は、最後の引数を特別なケースにする必要があります。実際、リスト内包表記を使用して上記を1行で書くことができます(読みやすくするために長く書きました)。あなたが最後の用語を特別なケースにしなければならないなら、それをするのはそれほど簡単ではないでしょう。


2
最後の引数を特別な場合にする必要はなくjoin、その場合は次のように使用できますdef __repr__(self): 'obj(' + ', '.join([repr(arg) for arg in obj.args]) + ')'
スザンヌデュペロン2013

また、Pythonで記述されておらず、などの優れた機能を持たないツールからのコード生成にも役立ちますjoin
asmeurer 2013

2

PEP 8-Pythonコードのスタイルガイド-末尾のコンマを使用する場合

末尾のコンマは通常はオプションですが、1つの要素のタプルを作成する場合は必須です(Python 2ではprintステートメントのセマンティクスがあります)。明確にするために、後者を(技術的に冗長な)括弧で囲むことをお勧めします。

はい:

FILES = ('setup.cfg',)

わかりましたが、混乱します:

FILES = 'setup.cfg',

後続のコンマが冗長である場合、バージョン管理システムが使用されているとき、値のリスト、引数、またはインポートされたアイテムが時間の経過とともに拡張されることが予想されるときに、それらはしばしば役立ちます。パターンは、各値(など)を1行に1つずつ配置し、常に末尾にコンマを追加し、次の行に右括弧/大括弧/中括弧を追加します。ただし、終了デリミタと同じ行に末尾のコンマを置くことは意味がありません(上記のシングルトンタプルの場合を除いて)。

はい:

FILES = [
    'setup.cfg',
    'tox.ini',
    ]
initialize(FILES,
           error=True,
           )

番号:

FILES = ['setup.cfg', 'tox.ini',]
initialize(FILES, error=True,)

-5

コーディングスタイルはあなたの好みです、あなたがコーディング標準が重要だと思うなら、あなたを導くことができるPEP-8があります。

次の表現の結果についてどう思いますか?

x = (3)
x = (3+2)
x = 2*(3+2)

はい、xは単なる数値です。


1
それはあなたの考えを説明するのに不十分な方法です。明示的は暗黙的よりも優れています。
ギルヘルムデビッドダコスタ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.