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?



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.


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.


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.


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')


('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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.