Mengapa trailing koma diizinkan dalam daftar?

135

Saya ingin tahu mengapa di Python koma tertinggal dalam daftar adalah sintaks yang valid, dan tampaknya Python mengabaikannya:

>>> ['a','b',]
['a', 'b']

Masuk akal ketika tuple sejak ('a')dan ('a',)dua hal yang berbeda, tetapi dalam daftar?

Burhan Khalid
sumber
stackoverflow.com/questions/7992559/...
Ciro Santilli 郝海东 冠状 病 六四 事件 事件 法轮功
7
Tanda koma juga diperbolehkan dalam daftar di C, C ++, Java, JavaScript, dll.
Nayuki

Jawaban:

223

Keuntungan utama adalah membuat daftar multi-baris lebih mudah untuk diedit dan mengurangi kekacauan dalam diff.

Mengubah:

s = ['manny',
     'mo',
     'jack',
]

untuk:

s = ['manny',
     'mo',
     'jack',
     'roger',
]

hanya melibatkan perubahan satu baris dalam diff:

  s = ['manny',
       'mo',
       'jack',
+      'roger',
  ]

Ini mengalahkan perbedaan multi-garis yang lebih membingungkan ketika koma trailing dihilangkan:

  s = ['manny',
       'mo',
-      'jack'
+      'jack',
+      'roger'
  ]

Perbedaan terakhir membuat lebih sulit untuk melihat bahwa hanya satu baris yang ditambahkan dan baris lainnya tidak mengubah konten.

Ini juga mengurangi risiko melakukan hal ini:

s = ['manny',
     'mo',
     'jack'
     'roger'  # Added this line, but forgot to add a comma on the previous line
]

dan memicu rangkaian string literal implisit , menghasilkan s = ['manny', 'mo', 'jackroger']bukannya hasil yang diinginkan.

Raymond Hettinger
sumber
6
Ini masuk akal (sebagian besar), tetapi saya akan sangat terkejut jika parser bahasa dirancang untuk membuat perbedaan lebih mudah.
Burhan Khalid
94
@ BurhanKhalid: Desainer bahasa adalah programmer, dan programmer melakukan banyak hal untuk membuat hidup mereka lebih mudah.
Greg Hewgill
10
@ Burhan Jika Anda tidak percaya penjelasan itu, bagaimana kalau itu juga lebih mudah untuk mendefinisikan tata bahasa seperti itu? ;) Bandingkan List = "[" {Item ","} "]".vsList = "[" ({Item","}Item|)"]".
Voo
23
Ini juga memudahkan program lain untuk membuat kode secara otomatis - jauh lebih mudah hanya mencetak "\"item\","untuk setiap item daripada mencetak "\"item\""untuk setiap item diikuti oleh ","untuk semua kecuali item terakhir.
Adam Rosenfield
9
@Vo, saya pikir hal yang sama juga tetapi tata bahasa yang terakhir harus didefinisikan karena masih daftar Python yang valid.
Alexander Suraphel
34

Ini adalah konvensi sintaksis umum untuk membolehkan koma tertinggal dalam array, bahasa seperti C dan Java mengizinkannya, dan Python tampaknya telah mengadopsi konvensi ini untuk daftar struktur datanya. Ini sangat berguna saat membuat kode untuk mengisi daftar: cukup buat urutan elemen dan koma, tidak perlu menganggap yang terakhir sebagai kasus khusus yang seharusnya tidak memiliki koma di bagian akhir.

Óscar López
sumber
30

Ini membantu untuk menghilangkan jenis bug tertentu. Terkadang lebih jelas untuk menulis daftar pada banyak baris. Tetapi dalam, nanti pemeliharaan Anda mungkin ingin mengatur ulang item.

l1 = [
        1,
        2,
        3,
        4,
        5
]

# Now you want to rearrange

l1 = [
        1,
        2,
        3,
        5
        4,
]

# Now you have an error

Tetapi jika Anda membolehkan tanda koma, dan menggunakannya, Anda dapat dengan mudah mengatur ulang garis tanpa menimbulkan kesalahan.

Keith
sumber
1
Ini rapi, tetapi Anda dapat menghindari ini dengan pra-pending koma. Saya melakukan itu sepanjang waktu ketika menulis SQL
Burhan Khalid
38
Bahkan jika Anda menambahkan dulu koma ke setiap elemen, Anda masih harus menghilangkan koma pada yang pertama.
Greg Hewgill
Linter harus bisa menangkap ini, bukan?
viki.omega9
6

Sebuah tuple berbeda karena ('a')diperluas menggunakan kelanjutan implisit dan ()s sebagai operator prioritas, sedangkan ('a',)mengacu pada tuple 1 panjang.

Contoh asli Anda seharusnya tuple('a')

richo
sumber
('a'),adalah string; tetapi poin saya adalah bahwa trailing koma di tuple adalah penting, tetapi dalam daftar mereka tampaknya belum Python menerimanya.
Burhan Khalid
1
Mereka secara diam-diam dibuang dalam kedua kasus, hanya saja dalam tuple diperlukan untuk membedakannya dari string di braket.
richo
tuple('a')mungkin contoh yang buruk, karena secara umum tuple(x)dan (x,)bukan hal yang sama. tuple('ab') != ('ab',). tuple('a') == ('a',)hanya karena 'a'ada untaian panjang 1.
chepner
Dari REPL: >>> ("a",) == ("a") False >>> ("ab",) == ("ab") False >>> ("ab", "bc",) == ("ab", "bc") True
Seraphya
1

Alasan utamanya adalah untuk membuat diff tidak terlalu rumit. Misalnya Anda memiliki daftar:

list = [
    'a',
    'b',
    'c'
]

dan Anda ingin menambahkan elemen lain ke dalamnya. Maka Anda akan akhirnya melakukan ini:

list = [
    'a',
    'b',
    'c',
    'd'
]

dengan demikian, diff akan menunjukkan bahwa dua baris telah diubah, pertama menambahkan ',' sejalan dengan 'c' dan menambahkan 'd' di baris terakhir.

Jadi, python memungkinkan mengekor ',' dalam elemen terakhir dari daftar, untuk mencegah perbedaan ekstra yang dapat menyebabkan kebingungan.

Nitish Chauhan
sumber