Bagaimana pernyataan dapat dinonaktifkan dengan python

Click, pustaka CLI populer yang saya pelihara, menggunakan variabel __debug__ dan assert. Ada banyak interaksi kompleks saat mengonfigurasi objek cli, jadi kami ingin memeriksa apakah developer tidak melakukan kesalahan tertentu. Namun, waktu mulai untuk cli sangat penting, jadi pemeriksaan tersebut tidak boleh dijalankan dalam produksi

Ini adalah sesuatu yang sudah lama ada di pikiran saya, tetapi saya belum pernah mengukur overhead klik/dekorator pada waktu mulai. Di $work saya, kami adalah pengguna berat klik [dibungkus dengan pustaka kenyamanan CLI kami sendiri] dan waktu mulai adalah salah satu keluhan terbesar dari pengguna CLI Python kami. Sekarang, beberapa di antaranya adalah kesalahan kami [mis. g. dependensi melakukan banyak pekerjaan, atau akses jaringan pada impor, dll. ] dan tumpukan Python kami "menderita" dari banyak fungsi tambahan yang tidak dimiliki tumpukan bahasa lain, jadi ini bukan perbandingan yang sepenuhnya adil. Tapi misalnya, CLI yang paling umum digunakan [secara harfiah, setiap dev akan menggunakannya beberapa kali sehari], ditulis dengan Python dan mereka telah melakukan banyak peretasan khusus untuk meningkatkan waktu mulai jalur cepat. Saya menduga bahwa penggunaan sintaksis @decorator yang berat, yang semuanya dieksekusi pada waktu impor, merupakan penyebab masalah start up, tetapi saya tidak memiliki data untuk mendukungnya

Oh dan saya harus menyebutkan, kami tidak menjalankan CLI produksi kami dengan

if __debug__ and cond:
   raise AssertionError[errormessage]
0, meskipun kami biasanya menjalankannya dalam mode isolasi

Jadi, mari kita coba dulu ide meringkasnya di sini

Beberapa orang bersikeras bahwa pernyataan tidak boleh digunakan untuk aliran kontrol [

if __debug__ and cond:
   raise AssertionError[errormessage]
1], tetapi sebagai upaya terakhir untuk menemukan bahwa ada yang tidak beres dalam kode [dan bukan dalam data yang dikontrol pengguna] dan mereka menegaskan untuk memiliki kode . Padahal orang tidak setuju apakah kita ingin itu terjadi di produksi juga

Orang lain terkadang menggunakannya sebagai fitur aliran kontrol, mis. g. dalam percobaan/kecuali di mana kami ingin kesalahan atau pemeriksaan yang mengevaluasi ke Salah diperlakukan dalam blok kecuali yang sama

Saya pikir kita semua dapat mengatakan bahwa secara teori, kode yang kita produksi selalu sempurna dan dalam praktiknya, instance Sentry kita menceritakan kisah yang berbeda. Yang membuat saya percaya bahwa kesalahan AKAN terjadi dalam produksi dan saya selalu ingin kesalahan memandu saya ke bug sejelas mungkin, terlepas dari apakah saya ingin, katakanlah, mengabaikan dokumen

Fakta bahwa seringkali bukan orang yang sama yang menulis kode dan yang menjalankannya [terutama dalam kasus ketergantungan] membuat sulit untuk mendorong gagasan bahwa "tidak apa-apa karena Anda selalu dapat memilih untuk tidak menggunakan

if __debug__ and cond:
   raise AssertionError[errormessage]
0", dan ini saja

Disebutkan bahwa dalam beberapa kasus, kami benar-benar ingin kemampuan untuk menyatakan tidak berjalan

Juga, tentang hal-hal yang tidak disebutkan, tetapi yang ingin saya tambahkan

  • Saya tidak tahu tentang Anda, tapi saya bukan penggemar kode yang berperilaku berbeda dalam produksi dan pengujian, terutama tidak jelas. Itu cara yang bagus untuk membuat masalah yang sulit direproduksi. Jika saya membaca laporan Sentry, dan mengikuti kode di repo saya, dan saya melihat pernyataan, saya akan berasumsi bahwa pernyataan tersebut dijalankan. Sebelum saya menyadari bahwa saya mungkin salah mengikuti kode karena penegasan diabaikan, saya mungkin telah kehilangan cukup banyak waktu

Saya punya beberapa saran, tidak harus satu paket, dan kita bisa pilih-pilih, tapi menurut saya itu bisa menarik dan saya ingin pendapat Anda

  • if __debug__ and cond:
       raise AssertionError[errormessage]
    
    0 berhenti mengabaikan pernyataan, meskipun terus mendefinisikan __debug__ ke
    if __debug__ and cond:
       raise AssertionError[errormessage]
    
    6
  • Orang yang ingin menulis pernyataan yang tidak dieksekusi [yang saya percaya bukan mayoritas? tapi itu mungkin bias konfirmasi saya berbicara] dapat menempatkan mereka di belakang
    if __debug__ and cond:
       raise AssertionError[errormessage]
    
    7, yang membuatnya lebih eksplisit
  • tidak mem-parsing/menyimpan dokumen diekspos melalui flag khusus, terlepas dari pengoptimalan
  • [mencoba berpikir apakah mengekspos "tegasan yang diabaikan" melalui bendera khusus akan masuk akal atau tidak. Idenya adalah bahwa itu datang dengan peringatan di doc bahwa tidak semua kode telah ditulis dengan gagasan penegasan sebagai opsional, jadi 100% pada orang yang menjalankannya untuk memutuskan apakah mereka menginginkan ini atau tidak, bukan pada . ]

Pernyataan yang tidak dapat dinonaktifkan bukanlah pernyataan. Penegasan harus selalu berlalu. Jika Anda berharap mereka gagal [terlepas dari pesimisme umum bahwa kode apa pun bisa bermasalah] maka itu bukan pernyataan

Petunjuknya ada di namanya

penegasan [kata benda] pernyataan fakta atau keyakinan yang meyakinkan dan kuat

Saat kita membaca pernyataan, kita harus membacanya sebagai komentar yang dicentang. Ini adalah komentar tentang kode [yaitu kondisi yang berlaku] yang diperiksa oleh juru bahasa untuk kita

Jika Anda memiliki tes yang Anda perkirakan terkadang gagal, sehingga Anda tidak ingin mengoptimalkannya, cara yang tepat untuk melakukannya adalah dengan tes dan kenaikan gaji. Anda bahkan dapat menulisnya dalam satu baris

if condition: raise WhateverException['message']

Adapun pertanyaan Anda tentang apakah Anda diharapkan untuk menjalankan Python dengan flag -O, itu adalah 100% keputusan bisnis untuk dijawab oleh manajemen Anda

Jawaban itu mungkin akan tergantung pada bagaimana Anda mengajukan pertanyaan

“Kami dapat menjalankan dalam mode -O yang akan mengungkapkan banyak bug dalam penanganan kesalahan kami dan memberikan kecepatan yang tidak signifikan. Haruskah kita melakukannya?”

“Kita dapat menjalankan dalam mode -O yang akan menonaktifkan pemeriksaan validasi program ekstra yang selalu lolos, memberikan kecepatan yang kecil namun bermakna. Haruskah kita melakukannya?”

steven. daprano

Pernyataan yang tidak dapat dinonaktifkan bukanlah pernyataan. Penegasan harus selalu berlalu. Jika Anda berharap mereka gagal [terlepas dari pesimisme umum bahwa kode apa pun bisa bermasalah] maka itu bukan pernyataan

Petunjuknya ada di namanya

penegasan [kata benda] pernyataan fakta atau keyakinan yang meyakinkan dan kuat

@steven. daprano, bahwa setidaknya sebagian dari kita berpikir secara berbeda adalah bukti yang cukup bahwa Anda mengambil pandangan fundamentalis tentang peran pernyataan

Masalah epistemologis yang kami coba selesaikan adalah itu

setiap pernyataan dan ekspresi dalam sebuah program adalah "pernyataan fakta atau keyakinan yang meyakinkan dan kuat"

Kami tidak "mencoba" untuk membuat program menjadi benar. Kami yakin [cukup] bahwa program benar ketika kami mengirimkannya ke produksi. Namun, pendaftar bug kami membuktikan bahwa kami sering salah. Menegaskan keadaan yang diharapkan menangkap begitu banyak kekeliruan sehingga membuatnya berharga [Mengapa kekeliruan? Karena otak kita tidak berfungsi sebagai komputer]

Ada juga yang sering kita sebut kode yang tidak kita tulis, dan kode itu mungkin gagal secara halus

Ada juga komputer tempat kita menjalankan program kita mungkin gagal sedikit demi sedikit. Menggunakan pernyataan membantu kami mendeteksi kegagalan tersebut dan masuk ke mode pemulihan

Mengapa menggunakan ________15______ bukan

if __debug__ and cond:
   raise AssertionError[errormessage]
9?

Setelah membaca semua komentar, pendapat saya adalah bahwa kami akan terus mendiskusikan tema-tema ini untuk waktu yang lama sebelum kami mencapai konsensus tentang apa yang baik untuk dilakukan secara umum.

Untuk saat ini, saya mengusulkan kompromi minimal

  • tambahkan opsi
    if condition: raise WhateverException['message']
    
    _1 ke penerjemah
    if condition: raise WhateverException['message']
    
    2 yang membuat pernyataan selalu aktif
  • tambahkan variabel lingkungan
    if condition: raise WhateverException['message']
    
    _3 untuk tujuan yang sama

Ini tidak terlalu merepotkan, dan ini adalah cara untuk membiarkan semua orang memilikinya dengan cara yang menurut mereka terbaik untuk mereka

Preferensi saya sendiri adalah menegaskan untuk mengizinkan memperkenalkan blok yang memunculkan

if condition: raise WhateverException['message']
4 jika tidak ada pernyataan lain yang dimunculkan dari blok tersebut, tetapi itu adalah perubahan yang lebih besar mungkin perlu diskusi lebih lanjut

Bagaimana cara menghapus AssertionError dengan Python?

Pernyataan penegasan . Pengecualian AssertionError dapat ditangkap dan ditangani seperti pengecualian lainnya menggunakan pernyataan try-except , tetapi jika tidak ditangani, mereka akan menghentikan program dan menghasilkan traceback.

Apa yang menyebabkan kesalahan pernyataan?

Kegagalan pernyataan terjadi ketika server basis data tidak dapat melanjutkan pemrosesan normal dan harus dimatikan . Anda dapat memperbaiki beberapa masalah yang menyebabkan kegagalan pernyataan, seperti masalah disk. Untuk masalah lain yang menyebabkan kegagalan pernyataan, Anda harus menghubungi Dukungan Perangkat Lunak IBM®.

Mengapa tidak menggunakan penegasan dengan Python?

TL;DR — Pernyataan penegasan sangat berguna untuk men-debug aplikasi Python tetapi tidak dapat digunakan untuk penanganan kesalahan normal atau alur kontrol karena keduanya akan. Hentikan aplikasi dengan memunculkan pengecualian, yang dapat menyebabkan terhentinya produksi .

Apa yang terjadi jika menegaskan gagal Python?

pernyataan penegasan memiliki syarat dan jika syarat tersebut tidak terpenuhi program akan berhenti dan memberikan AssertionError. pernyataan tegas juga dapat memiliki kondisi dan pesan kesalahan opsional. Jika kondisi tidak terpenuhi, tegas menghentikan program dan memberikan AssertionError bersama dengan pesan kesalahan

Bài mới nhất

Chủ Đề