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.
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,54,]# Now you have an error
Tetapi jika Anda membolehkan tanda koma, dan menggunakannya, Anda dapat dengan mudah mengatur ulang garis tanpa menimbulkan kesalahan.
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.
('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.
Jawaban:
Keuntungan utama adalah membuat daftar multi-baris lebih mudah untuk diedit dan mengurangi kekacauan dalam diff.
Mengubah:
untuk:
hanya melibatkan perubahan satu baris dalam diff:
Ini mengalahkan perbedaan multi-garis yang lebih membingungkan ketika koma trailing dihilangkan:
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:
dan memicu rangkaian string literal implisit , menghasilkan
s = ['manny', 'mo', 'jackroger']
bukannya hasil yang diinginkan.sumber
List = "[" {Item ","} "]".
vsList = "[" ({Item","}Item|)"]".
"\"item\","
untuk setiap item daripada mencetak"\"item\""
untuk setiap item diikuti oleh","
untuk semua kecuali item terakhir.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.
sumber
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.
Tetapi jika Anda membolehkan tanda koma, dan menggunakannya, Anda dapat dengan mudah mengatur ulang garis tanpa menimbulkan kesalahan.
sumber
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')
sumber
('a'),
adalah string; tetapi poin saya adalah bahwa trailing koma di tuple adalah penting, tetapi dalam daftar mereka tampaknya belum Python menerimanya.tuple('a')
mungkin contoh yang buruk, karena secara umumtuple(x)
dan(x,)
bukan hal yang sama.tuple('ab') != ('ab',)
.tuple('a') == ('a',)
hanya karena'a'
ada untaian panjang 1.>>> ("a",) == ("a")
False>>> ("ab",) == ("ab")
False>>> ("ab", "bc",) == ("ab", "bc")
TrueAlasan utamanya adalah untuk membuat diff tidak terlalu rumit. Misalnya Anda memiliki daftar:
dan Anda ingin menambahkan elemen lain ke dalamnya. Maka Anda akan akhirnya melakukan ini:
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.
sumber