web-dev-qa-db-ja.com

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

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

a = ('foo',)

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

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

空のTupleを除くすべての場合において、カンマは重要です。括弧は、他の構文上の理由で必要な場合にのみ必要です。関数引数のセット、演算子の優先順位からタプルを区別するため、または改行を許可するためです。

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

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

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

66
Duncan

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

(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,
               )

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

80
Jeff Mercado

末尾のコンマのもう1つの利点は、差分の見栄えが良くなることです。で始めた場合

a = [
    1,
    2,
    3
]

に変更しました

a = [
    1,
    2,
    3,
    4
]

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

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

一方、次のように末尾のコンマで開始した場合

a = [
    1,
    2,
    3,
]

次に、差分はちょうど

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

オプションです: Python wiki を参照してください。

要約:単一要素のタプルには末尾のコンマが必要ですが、それはoptionalです複数要素のタプル用。

12
Dave Everitt

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

>>> (('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'))
8
MaPy

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

6
Adam Zalcman

それは簡単な答えです。

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

そして

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

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

たとえば、python console:

a =( "s")

a = a +(1,2,3)

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

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

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

6
rajni kant

これが存在するもう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行で書くことができます(読みやすくするために、もっと長く書きました)。あなたが最後の用語を特別なケースにしなければならなかったならば、それをすることはそれほど簡単ではないでしょう。

4
asmeurer

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

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

はい:

FILES = ('setup.cfg',)

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

FILES = 'setup.cfg',

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

はい:

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

いいえ:

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