Kadang-kadang saya memecah kondisi panjang if
menjadi beberapa baris. Cara paling jelas untuk melakukan ini adalah:
if (cond1 == 'val1' and cond2 == 'val2' and
cond3 == 'val3' and cond4 == 'val4'):
do_something
Tidak terlalu menarik secara visual, karena aksi menyatu dengan kondisi. Namun, ini adalah cara alami menggunakan indentasi Python yang benar dari 4 spasi.
Untuk saat ini saya menggunakan:
if ( cond1 == 'val1' and cond2 == 'val2' and
cond3 == 'val3' and cond4 == 'val4'):
do_something
Tapi ini tidak terlalu cantik. :-)
Bisakah Anda merekomendasikan cara alternatif?
python
coding-style
if-statement
Eli Bendersky
sumber
sumber
pep8
kriteria paket. Masalahpep8
paket # 126 adalah tentang memperbaiki paket untuk secara ketat mengikuti spesifikasi PEP8. Diskusi untuk masalah ini mencakup beberapa saran gaya juga terlihat di sini.Jawaban:
Anda tidak perlu menggunakan 4 spasi pada saluran kondisional kedua Anda. Mungkin menggunakan:
Juga, jangan lupa spasi putih lebih fleksibel daripada yang Anda kira:
Keduanya cukup jelek.
Mungkin kehilangan tanda kurung ( Panduan Gaya mencegah ini)?
Setidaknya ini memberi Anda beberapa perbedaan.
Atau bahkan:
Saya rasa saya lebih suka:
Berikut Panduan Gaya , yang (sejak 2010) merekomendasikan menggunakan tanda kurung.
sumber
and
danif
juga.Saya telah menggunakan yang berikut ini dalam kasus degenerasi di mana itu hanya AND atau OR.
Ini mencukur beberapa karakter dan membuatnya jelas bahwa tidak ada kehalusan kondisi.
sumber
if destroy_world and DestroyTheWorld() == world_is_destroyed: ...
. Hebat, sekarang Anda baru saja menghancurkan dunia karena kecelakaan. BAGAIMANA BISA ANDA?Seseorang harus memperjuangkan penggunaan spasi putih vertikal di sini! :)
Ini membuat setiap kondisi terlihat jelas. Ini juga memungkinkan ekspresi yang lebih bersih dari kondisi yang lebih kompleks:
Ya, kami memperdagangkan sedikit real estat vertikal untuk kejelasan. Layak IMO.
sumber
and
dan jugaor
) adalah setelah operator, bukan sebelum itu.PEP8
tetapi juga membuat lebih sulit untuk menentukan operasi logika yang Anda gunakan. Saya akan gagal dalam hal ini jika datang ke meja saya melalui review kode.Saya lebih suka gaya ini ketika saya memiliki kondisi jika sangat besar:
sumber
and
danor
pada awal baris melanggar PEP 0008 , yang menyatakan "Tempat yang disukai untuk istirahat di sekitar operator biner adalah setelah operator, bukan sebelum itu." . Saya suka memiliki braket penutup dan titik dua pada saluran mereka sendiri untuk memisahkan kondisi if dari bodi, dan (sangat mungkin untuk melakukan ini sambil menjaga operator boolean Anda di akhir baris untuk kepatuhan PEP-0008).For decades the recommended style was to break after binary operators. But this can hurt readability in two ways
...In Python code, it is permissible to break before or after a binary operator, as long as the convention is consistent locally. For new code Knuth's style is suggested.
(Gaya Knuth memulai garis dengan operator).Inilah pendapat saya yang sangat pribadi: kondisi lama (dalam pandangan saya) adalah bau kode yang menyarankan refactoring ke fungsi / metode pengembalian boolean. Sebagai contoh:
Sekarang, jika saya menemukan cara untuk membuat kondisi multi-line terlihat bagus, saya mungkin akan menemukan diri saya puas dengan memilikinya dan melewatkan refactoring.
Di sisi lain, membiarkan mereka mengganggu indera estetika saya bertindak sebagai insentif untuk refactoring.
Kesimpulan saya, oleh karena itu, adalah bahwa beberapa kondisi garis harus terlihat jelek dan ini merupakan insentif untuk menghindarinya.
sumber
Ini tidak banyak membaik tetapi ...
sumber
Saya sarankan memindahkan
and
kata kunci ke baris kedua dan membuat indentasi semua baris yang berisi kondisi dengan dua spasi alih-alih empat:Inilah cara saya memecahkan masalah ini dalam kode saya. Memiliki kata kunci sebagai kata pertama dalam garis membuat kondisi jauh lebih mudah dibaca, dan mengurangi jumlah ruang semakin membedakan kondisi dari tindakan.
sumber
Tampaknya layak mengutip PEP 0008 (panduan gaya resmi Python), karena berkomentar tentang masalah ini panjang lebar:
Perhatikan "tidak terbatas pada" dalam kutipan di atas; Selain pendekatan yang disarankan dalam panduan gaya, beberapa yang disarankan dalam jawaban lain untuk pertanyaan ini juga dapat diterima.
sumber
Inilah yang saya lakukan, ingat bahwa "semua" dan "apa saja" menerima iterable, jadi saya hanya memasukkan syarat yang panjang dalam daftar dan membiarkan "semua" melakukan pekerjaan.
sumber
Saya terkejut tidak melihat solusi pilihan saya,
Karena
and
merupakan kata kunci, itu akan disorot oleh editor saya, dan terlihat cukup berbeda dari do_something di bawahnya.sumber
Menambah apa yang dikatakan @krawyoti ... Kondisi lama berbau karena sulit dibaca dan sulit dimengerti. Menggunakan fungsi atau variabel membuat kode lebih jelas. Dalam Python, saya lebih suka menggunakan ruang vertikal, melampirkan tanda kurung, dan menempatkan operator logis di awal setiap baris sehingga ekspresi tidak terlihat seperti "mengambang".
Jika kondisi perlu dievaluasi lebih dari sekali, seperti dalam satu
while
lingkaran, maka menggunakan fungsi lokal adalah yang terbaik.sumber
Secara pribadi, saya ingin menambahkan makna pada pernyataan if panjang. Saya harus mencari melalui kode untuk menemukan contoh yang sesuai, tetapi inilah contoh pertama yang terlintas dalam pikiran: katakanlah saya kebetulan menemukan beberapa logika unik di mana saya ingin menampilkan halaman tertentu tergantung pada banyak variabel.
Bahasa Inggris: "Jika pengguna yang masuk BUKAN seorang guru administrator, tetapi hanya guru biasa, dan bukan siswa itu sendiri ..."
Tentu ini mungkin terlihat baik-baik saja, tetapi membaca itu jika pernyataan itu banyak pekerjaan. Bagaimana kalau kita menetapkan logika pada label yang masuk akal. "Label" sebenarnya adalah nama variabel:
Ini mungkin tampak konyol, tetapi Anda mungkin memiliki kondisi lain di mana Anda HANYA ingin menampilkan item lain jika, dan hanya jika, Anda menampilkan panel guru ATAU jika pengguna memiliki akses ke panel tertentu lainnya secara default:
Cobalah menulis kondisi di atas tanpa menggunakan variabel untuk menyimpan dan memberi label logika Anda, dan Anda tidak hanya berakhir dengan pernyataan logis yang sangat sulit dibaca, tetapi Anda juga baru saja mengulangi sendiri. Meskipun ada pengecualian yang masuk akal, ingat: Jangan Ulangi Diri Sendiri (KERING).
sumber
"semua" dan "apa saja" bagus untuk banyak kondisi dengan tipe huruf yang sama. TAPI mereka selalu mengevaluasi semua kondisi. Seperti yang ditunjukkan dalam contoh ini:
sumber
all()
itu, kecuali jika Anda akan membungkusnya masing-masing dalam lambda dan menggunakanf()
trik Anda , semuanya akan dievaluasi. Dengan kata lain, Aaron: Saya pikir Anders mencoba berbicara tentang kondisi secara umum, menggunakan callable sebagai contoh khusus; tetapi jawaban Anda hanya berlaku untuk fungsi.(Saya telah sedikit mengubah pengidentifikasi sebagai nama dengan lebar tetap tidak mewakili kode nyata - setidaknya bukan kode nyata yang saya temui - dan akan percaya pada keterbacaan contoh.)
Ini bekerja dengan baik untuk "dan" dan "atau" (penting bahwa mereka pertama kali berada di baris kedua), tetapi lebih sedikit untuk kondisi panjang lainnya. Untungnya, yang pertama tampaknya menjadi kasus yang lebih umum sementara yang terakhir sering mudah ditulis ulang dengan variabel sementara. (Biasanya tidak sulit, tetapi bisa sulit atau jauh lebih jelas / mudah dibaca untuk menjaga hubungan arus pendek "dan" / "atau" ketika menulis ulang.)
Karena saya menemukan pertanyaan ini dari posting blog Anda tentang C ++ , saya akan menyertakan bahwa gaya C ++ saya identik:
sumber
Polos dan sederhana, juga lolos pemeriksaan pep8:
Baru-baru ini saya lebih suka fungsi
all
danany
fungsinya, karena saya jarang mencampurkan perbandingan Dan dan Atau ini berfungsi dengan baik, dan memiliki keuntungan tambahan Gagal Dini dengan pemahaman generator:Hanya ingat untuk lulus dalam satu iterable! Melewati argumen-N tidak benar.
Catatan:
any
seperti banyakor
perbandingan,all
seperti banyakand
perbandingan.Ini menggabungkan dengan baik dengan pemahaman generator, misalnya:
Lebih lanjut tentang: pemahaman generator
sumber
Bagaimana jika kita hanya memasukkan garis kosong tambahan antara kondisi dan tubuh dan melakukan sisanya dengan cara kanonik?
ps Saya selalu menggunakan tab, bukan spasi; Saya tidak bisa memperbaiki ...
sumber
and
danor
pernyataan harus dimulai pada baris berikutnyaApa yang biasanya saya lakukan adalah:
dengan cara ini kurung kurawal dan usus besar secara visual menandai akhir dari kondisi kita.
sumber
and
atauor
.Semua responden yang juga menyediakan multi-kondisional untuk pernyataan if sama jeleknya dengan masalah yang disajikan. Anda tidak menyelesaikan masalah ini dengan melakukan hal yang sama ..
Bahkan jawaban PEP 0008 menjijikkan.
Inilah pendekatan yang jauh lebih mudah dibaca
Ingin aku memakan kata-kataku? Yakinkan saya bahwa Anda membutuhkan multi-kondisi dan saya akan mencetak ini dan memakannya untuk hiburan Anda.
sumber
Saya pikir solusi @kanda akan baik dengan twist kecil. Jika Anda memiliki kondisi dan nilai di daftar masing-masing, Anda dapat menggunakan pemahaman daftar untuk melakukan perbandingan, yang akan membuat hal-hal sedikit lebih umum untuk menambahkan pasangan kondisi / nilai.
Jika saya benar-benar ingin membuat kode pernyataan seperti ini, saya akan menulisnya seperti ini untuk keterbacaan:
Dan hanya untuk melempar solusi lain di luar sana dengan seorang
iand
operator :sumber
all(map(eq, have, expected))
. (denganfrom operator import eq
)Hanya beberapa ide acak lainnya demi kelengkapan. Jika mereka bekerja untuk Anda, gunakan itu. Kalau tidak, Anda mungkin lebih baik mencoba sesuatu yang lain.
Anda juga bisa melakukan ini dengan kamus:
Opsi ini lebih rumit, tetapi Anda mungkin juga menganggapnya berguna:
Entah apakah itu bekerja untuk Anda, tetapi itu pilihan lain untuk dipertimbangkan. Ini satu cara lagi:
Dua yang terakhir saya belum diuji, tetapi konsep harus cukup untuk membuat Anda pergi jika itu yang Anda inginkan.
(Dan sebagai catatan, jika ini hanya satu kali, Anda mungkin lebih baik menggunakan metode yang Anda sajikan pada awalnya. Jika Anda melakukan perbandingan di banyak tempat, metode ini dapat meningkatkan keterbacaan yang cukup untuk membuat Anda tidak merasa begitu buruk tentang fakta bahwa mereka agak berantakan.)
sumber
Saya telah berjuang untuk menemukan cara yang baik untuk melakukan ini juga, jadi saya baru saja datang dengan ide (bukan peluru perak, karena ini terutama masalah selera).
Saya menemukan beberapa kelebihan dalam solusi ini dibandingkan dengan yang lain yang pernah saya lihat, yaitu, Anda mendapatkan persis 4 ruang lekukan tambahan (bool), yang memungkinkan semua kondisi untuk berbaris secara vertikal, dan badan pernyataan if dapat dimasukkan ke dalam cara yang jelas (ish). Ini juga menyimpan manfaat evaluasi hubung singkat operator boolean, tetapi tentu saja menambahkan overhead panggilan fungsi yang pada dasarnya tidak melakukan apa-apa. Anda dapat berdebat (secara sah) bahwa fungsi apa pun yang mengembalikan argumennya dapat digunakan di sini alih-alih bool, tetapi seperti yang saya katakan, itu hanya sebuah gagasan dan pada akhirnya masalah selera.
Cukup lucu, ketika saya menulis ini dan berpikir tentang "masalah", saya datang dengan ide lain , yang menghilangkan overhead panggilan fungsi. Mengapa tidak menunjukkan bahwa kita akan memasuki kondisi kompleks dengan menggunakan pasangan kurung tambahan? Katakan, 2 lagi, untuk memberikan 2 spasi indentasi bagus dari sub-kondisi relatif terhadap tubuh pernyataan if. Contoh:
Saya agak suka ini karena ketika Anda melihatnya, sebuah lonceng dengan segera berbunyi di kepala Anda mengatakan "hei, ada hal rumit yang terjadi di sini!" . Ya, saya tahu bahwa tanda kurung tidak membantu keterbacaan, tetapi kondisi ini seharusnya jarang muncul, dan ketika itu muncul, Anda harus berhenti dan membacanya dengan cermat (karena kompleks ).
Pokoknya, hanya dua proposal lagi yang belum saya lihat di sini. Semoga ini bisa membantu seseorang :)
sumber
Anda dapat membaginya menjadi dua baris
Atau bahkan menambahkan satu syarat pada satu waktu. Dengan begitu, setidaknya itu memisahkan kekacauan dari
if
.sumber
Saya tahu utas ini sudah lama, tetapi saya memiliki beberapa kode Python 2.7 dan PyCharm (4.5) masih mengeluh tentang hal ini:
Bahkan dengan peringatan PEP8 "garis indentasi visual dengan indentasi yang sama dengan baris logis berikutnya", kode sebenarnya sepenuhnya OK? Itu bukan "indentasi berlebihan?"
... ada saatnya saya berharap Python akan menggigit peluru dan hanya pergi dengan kurung kurawal. Saya bertanya-tanya berapa banyak bug yang secara tidak sengaja diperkenalkan selama bertahun-tahun karena kesalahan indentasi ...
sumber
Kemas kondisi Anda ke dalam daftar, lalu lakukan sesuatu Suka:
sumber
Saya menemukan bahwa ketika saya memiliki kondisi yang panjang, saya sering memiliki kode pendek. Dalam hal ini, saya hanya menggandakan indentasi tubuh, dengan demikian:
sumber
atau jika ini lebih jelas:
Tidak ada alasan indentasi harus berupa kelipatan 4 dalam kasus ini, mis. Lihat "Disejajarkan dengan pembatas pembuka":
http://google-styleguide.googlecode.com/svn/trunk/pyguide.html?showone=Indentation#Indentation
sumber
Inilah pendekatan lain:
Ini juga memudahkan untuk menambahkan kondisi lain dengan mudah tanpa mengubah pernyataan if dengan hanya menambahkan kondisi lain ke daftar:
sumber
Saya biasanya menggunakan:
sumber
jika kondisi if & an else kita harus menjalankan beberapa pernyataan di dalamnya, maka kita dapat menulis seperti di bawah ini. Setiap saat kita memiliki contoh lain dengan satu pernyataan di dalamnya.
Terima kasih, ini berhasil untuk saya.
sumber
Maaf noobness saya, tetapi kebetulan saya tidak memiliki pengetahuan tentang #Python seperti kalian di sini, tetapi kebetulan saya menemukan sesuatu yang mirip ketika membuat skrip objek saya sendiri dalam pemodelan BIM 3D, jadi saya akan menyesuaikan algoritma saya dengan itu dari python.
Masalah yang saya temukan di sini, adalah dua sisi:
Lakukan untuk melewati semua masalah ini, skrip Anda harus seperti ini
Kelebihan metode ini:
Skrip dapat dibaca.
Script bisa dipelihara dengan mudah.
Semoga ini bisa membantu kalian semua
sumber