PEP 8, mengapa tidak ada spasi di sekitar '=' dalam argumen kata kunci atau nilai parameter default?

103

Mengapa PEP 8 merekomendasikan untuk tidak memiliki spasi =di sekitar argumen kata kunci atau nilai parameter default ?

Apakah ini tidak konsisten dengan merekomendasikan spasi di sekitar setiap kejadian =dalam kode Python?

Bagaimana:

func(1, 2, very_long_variable_name=another_very_long_variable_name)

lebih baik daripada:

func(1, 2, very_long_variable_name = another_very_long_variable_name)

Setiap tautan ke diskusi / penjelasan oleh BDFL Python akan dihargai.

Pikiran, pertanyaan ini lebih tentang kwargs daripada nilai default, saya baru saja menggunakan ungkapan dari PEP 8.

Saya tidak meminta pendapat. Saya menanyakan alasan di balik keputusan ini. Ini lebih seperti menanyakan mengapa saya menggunakan {pada baris yang sama dengan ifpernyataan dalam program C, bukan apakah saya harus menggunakannya atau tidak.

pemeriksaan jiwa
sumber

Jawaban:

72

Saya rasa itu karena argumen kata kunci pada dasarnya berbeda dari tugas variabel.

Misalnya, ada banyak kode seperti ini:

kw1 = some_value
kw2 = some_value
kw3 = some_value
some_func(
    1,
    2,
    kw1=kw1,
    kw2=kw2,
    kw3=kw3)

Seperti yang Anda lihat, masuk akal untuk menetapkan variabel ke argumen kata kunci yang dinamai persis sama, sehingga meningkatkan keterbacaan untuk melihatnya tanpa spasi. Lebih mudah untuk mengenali bahwa kami menggunakan argumen kata kunci dan tidak menetapkan variabel ke dirinya sendiri.

Selain itu, parameter cenderung berada di baris yang sama sedangkan tugas biasanya masing-masing berada di barisnya sendiri, jadi menghemat ruang mungkin menjadi masalah penting di sana.

fortran
sumber
6
ini bisa terjadi, tetapi masih tampak aneh untuk memperkenalkan ikon IMO ini dalam rekomendasi gaya kode untuk bahasa yang dirancang dengan baik, hanya untuk menyimpan 2 karakter. Seolah-olah gaya kode java mengatakan bahwa perlu menempatkan {baris baru setelahnya if(menyimpan jumlah karakter yang sama) tetapi tidak dalam definisi kelas. Parameter kata kunci juga berbeda dari nilai default tetapi masih menggunakan rekomendasi gaya yang sama.
pemeriksaan jiwa
3
Seperti yang saya katakan, mereka adalah hal yang berbeda. Masuk akal untuk menuliskannya secara berbeda.
fortran
6
saya akan mengatakan itu tidak benar-benar lebih mudah dibaca daripada kw1 = kw1, kw2 = kw2;) tapi mungkin itulah yang dipikirkan Guido dan Barry.
pemeriksaan jiwa
1
Saya akan menerima jawaban ini karena cukup meyakinkan. tidak keberatan dengan tautan yang mengonfirmasinya
periksa jiwa
5
Fakta bahwa argumen kata kunci pada dasarnya berbeda dari tugas variabel bukanlah argumen yang valid untuk memiliki IMO konvensi yang berbeda, karena perbedaannya sudah jelas dari konteksnya. Yang pertama terjadi dalam pemanggilan fungsi, dan yang terakhir perlu berdiri sendiri pada tingkat indentasi saat ini. IMO, untuk nama variabel yang lebih panjang dari 5-6 karakter (yaitu kehidupan nyata untuk sebagian besar), varian dengan spasi lebih mudah dibaca.
Axel
13

Saya tidak akan menggunakan very_long_variable_name sebagai argumen default. Jadi pertimbangkan ini:

func(1, 2, axis='x', angle=90, size=450, name='foo bar')

atas ini:

func(1, 2, axis = 'x', angle = 90, size = 450, name = 'foo bar')

Juga, tidak masuk akal untuk menggunakan variabel sebagai nilai default. Mungkin beberapa variabel konstan (yang sebenarnya bukan konstanta) dan dalam hal ini saya akan menggunakan nama yang semuanya huruf besar, deskriptif namun sesingkat mungkin. Jadi tidak ada yang lain_ sangat _...

rplnt
sumber
1
itu adalah argumen kata kunci, contoh serupa ada di PEP saya hanya membuatnya kurang terbaca
soulcheck
3
Anda mengatakan (pada dasarnya): untuk membuat aturan tanpa spasi masuk akal, tulis nama variabel yang sangat pendek. Tetapi JIKA seseorang memiliki nama variabel yang panjang, maka aturan tanpa spasi membuat lingkungan menjadi berantakan. Argumen bahwa 'ini bukan tugas, jadi mereka berbeda' tidak cocok untuk saya, karena saya lebih peduli tentang keterbacaan daripada tentang semantik dan karena jika itu bukan 'nilai default untuk sebuah tugas', lalu apa Itu?
PatrickT
1
@PatrickT Argumen "ini bukan penugasan, jadi mereka adalah hal yang berbeda" tidak menjelaskan mengapa itu (gagasan filosofis); Ini hanya menjelaskan mengapa itu bisa (gagasan sintaksis).
Mateen Ulhaq
11

Ada pro dan kontra.

Saya sangat tidak menyukai cara membaca kode yang sesuai dengan PEP8. Saya tidak percaya pada argumen yang very_long_variable_name=another_very_long_variable_namelebih bisa dibaca manusia daripada very_long_variable_name = another_very_long_variable_name. Ini bukan cara orang membaca. Ini adalah beban kognitif tambahan, terutama jika tidak ada penyorotan sintaks.

Namun, ada manfaat yang signifikan. Jika aturan spasi ditaati, pencarian parameter secara eksklusif menggunakan alat jauh lebih efektif.

Hywel Thomas
sumber
Nah, jika Anda tetap menggunakan spasi di sekitar =, menelusuri menggunakan alat seharusnya tidak berbeda.
NoName
10

IMO meninggalkan ruang untuk args memberikan pengelompokan visual yang lebih bersih dari pasangan arg / nilai; tampilannya tidak terlalu berantakan.

JoeC
sumber
Saya biasanya menyukai spasi, jadi saya cenderung meletakkan spasi di dalam tanda kurung juga sehingga semua parameter dikelilingi oleh spasi. Tapi saya pikir arg1=40itu lebih mudah dibaca karena hubungannya lebih jelas.
Charlie Gorichanaz
3

Saya pikir ada beberapa alasan untuk ini, meskipun saya mungkin hanya merasionalisasi:

  1. Ini menghemat ruang, memungkinkan lebih banyak definisi fungsi dan panggilan agar sesuai dalam satu baris dan menghemat lebih banyak ruang untuk nama argumen itu sendiri.
  2. Dengan menggabungkan setiap kata kunci dan nilai, Anda dapat dengan mudah memisahkan argumen yang berbeda dengan spasi setelah koma. Ini berarti Anda dapat dengan cepat melihat berapa banyak argumen yang Anda berikan.
  3. Sintaksnya kemudian berbeda dari tugas variabel, yang mungkin memiliki nama yang sama.
  4. Selain itu, sintaksnya (bahkan lebih) berbeda dari pemeriksaan kesetaraan a == byang juga bisa berupa ekspresi valid di dalam panggilan.
otus
sumber
3

Bagi saya itu membuat kode lebih mudah dibaca dan dengan demikian merupakan kesepakatan yang baik.

Saya pikir perbedaan utama dalam hal gaya antara penugasan variabel dan penugasan kata kunci fungsi adalah bahwa hanya boleh ada satu =baris untuk yang pertama, sedangkan umumnya ada beberapa= baris untuk yang terakhir.

Jika tidak ada pertimbangan lain, kita akan lebih suka foo = 42untukfoo=42 , karena yang terakhir ini bukan bagaimana tanda sama biasanya diformat, dan karena mantan baik secara visual memisahkan variabel dan nilai dengan spasi.

Tapi ketika ada beberapa tugas pada satu baris, kita lebih suka f(foo=42, bar=43, baz=44)untukf(foo = 42, bar = 43, baz = 44) , karena mantan visual memisahkan beberapa tugas dengan spasi, sedangkan yang terakhir tidak, sehingga agak sulit untuk melihat di mana pasangan kunci / nilai yang.

Berikut adalah cara lain untuk menggambarkannya: ada adalah konsistensi belakang konvensi. Konsistensi itu adalah: "tingkat pemisahan tertinggi" dibuat lebih jelas secara visual melalui spasi. Tingkat pemisahan yang lebih rendah tidak termasuk (karena akan membingungkan dengan spasi kosong yang memisahkan tingkat yang lebih tinggi). Untuk tugas variabel, tingkat pemisahan tertinggi adalah antara variabel dan nilai. Untuk penetapan kata kunci fungsi, tingkat pemisahan tertinggi adalah antara tugas individu itu sendiri.

Denziloe
sumber