Analog dengan Python dan JavaScript. Bagian dua

Kami terus menerbitkan terjemahan dari serangkaian artikel tentang persamaan dan perbedaan antara kedua bahasa.


Hari ini kita akan berbicara tentang serialisasi kamus, JSON, pelanggan tetap, kesalahan, dan pengecualian.


Artikel lain dalam seri ini:


  1. Bagian pertama adalah konversi tipe, operator ternary, akses ke properti dengan nama properti, kamus, daftar, string, rangkaian string.
  2. Artikel ini
  3. Bagian Tiga : Python dan JS modern: pola string (f-string), daftar membongkar, fungsi lambda, daftar iterasi, generator, set.
  4. Bagian keempat adalah argumen fungsi, membuat dan bekerja dengan kelas, pewarisan, pengambil setter, dan properti kelas.

Json


Saat bekerja dengan banyak API, akan lebih mudah untuk membuat serialisasi objek menjadi objek JSON untuk kemudahan transfer dan penguraian selanjutnya.


Python memiliki modul json standar:


import json json_data = json.dumps(dictionary, indent=4) dictionary = json.loads(json_data) 

Di sini kita memformat JSON dengan lekukan 4 spasi.


Di JS, ada objek JSON dengan metode untuk membuat dan mem-parsing string JSON:


 json_data = JSON.stringify(dictionary, null, 4); dictionary = JSON.parse(json_data); 

Mengurai string dengan pelanggan tetap


Pada artikel terakhir, kami menggabungkan beberapa baris menjadi satu. Tetapi bagaimana cara membagi satu string panjang menjadi beberapa, terutama jika separator bukan karakter tunggal seperti koma, tetapi seluruh jajaran opsi yang berbeda? Di sinilah ekspresi reguler dan metode split() datang untuk menyelamatkan.


Dalam Python, metode split() mengacu pada pola ekspresi reguler. Berikut ini cara membagi string teks menjadi kalimat tanda baca:


 import re #     "!?."         delimiter = re.compile(r'[!?\.]+\s*') text = "Hello!!! What's new? Follow me." sentences = delimiter.split(text) # sentences == ['Hello', "What's new", 'Follow me', ''] 

Di JS, metode split() merujuk ke string:


 //     "!?."         delimiter = /[!?\.]+\s*/; text = "Hello!!! What's new? Follow me."; sentences = text.split(delimiter) // sentences === ["Hello", "What's new", "Follow me", ""] 

Pencarian teratur berdasarkan pola


Ekspresi reguler sering digunakan untuk memvalidasi data dari formulir.
Misalnya, untuk memverifikasi kebenaran alamat email yang dimasukkan, itu harus dibandingkan dengan pola ekspresi reguler.


Penulis terjemahan dalam kursus

bahwa memeriksa alamat dengan pelanggan tetap adalah tugas yang tidak sepele dan sedikit lebih rumit daripada metode yang diberikan dalam artikel ini


Dengan Python, tampilannya akan seperti ini:


 import re # name, "@", and domain pattern = re.compile(r'([\w.+\-]+)@([\w\-]+\.[\w\-.]+)') match = pattern.match('hi@example.com') # match.group(0) == 'hi@example.com' # match.group(1) == 'hi' # match.group(2) == 'example.com' 

Jika bagian teks cocok dengan templat, maka menggunakan metode group() mengembalikan seluruh bagian di mana Anda dapat memilih masing-masing grup yang ditentukan dalam templat.


0 - seluruh baris (sub) yang cocok, 1 - grup pertama, 2 - yang kedua, dll.


Jika tidak ditemukan kecocokan, objek dengan tipe None akan dikembalikan.


Di JS, ada metode string yang match() yang mengembalikan bagian yang cocok dari string atau null .


 // name, "@", and domain pattern = /([\w.+\-]+)@([\w\-]+\.[\w\-.]+)/; match = 'hi@example.com'.match(pattern); // match[0] === 'hi@example.com' // match[1] === 'hi' // match[2] === 'example.com' 

Di JS, objek yang cocok terlihat seperti array. Elemen dengan indeks [0] adalah seluruh (sub) baris yang cocok, elemen 1 adalah grup pertama, ke-2 adalah yang kedua, dll. - semua sesuai dengan grup yang ditentukan dalam templat.


Terkadang, selain mencari, diperlukan untuk menentukan posisi sampel dalam teks. Ini dapat dilakukan dengan menggunakan metode search() .
Dalam Python, metode ini merujuk pada ekspresi reguler dan mengembalikan objek yang cocok. Objek yang cocok ini memiliki metode start() yang mengembalikan awal terjadinya substring ini di baris utama:


 text = 'Say hi at hi@example.com' first_match = pattern.search(text) if first_match: start = first_match.start() # start == 10 

Metode JS memiliki metode search() string search() mengembalikan indeks awal substring. Atau -1 jika tidak ada kecocokan yang ditemukan.


 text = 'Say hi at hi@example.com'; first_match = text.search(pattern); if (first_match > -1) { start = first_match; // start === 10 } 

Ganti dengan pola menggunakan ekspresi reguler


Biasanya, penggantian templat diperlukan saat Anda ingin menghapus data atau menambahkan beberapa properti ke teks. Misalnya, kita dapat mengambil garis dan membuat semua alamat email menemukan tautan:


Python memiliki metode pola sub() regex untuk ini:


 html = pattern.sub( r'<a href="mailto:\g<0>">\g<0></a>', 'Say hi at hi@example.com', ) # html == 'Say hi at <a href="mailto:hi@example.com">hi@example.com</a>' 

Pengembang JS dapat menggunakan metode string replace() :


 html = 'Say hi at hi@example.com'.replace( pattern, '<a href="mailto:$&">$&</a>', ); // html === 'Say hi at <a href="mailto:hi@example.com">hi@example.com</a>' 

Dengan Python, grup yang cocok tersedia sebagai \g<0>, \g<1>, \g<2> , dll.
Di JS, seperti $&, $1, $2 , dll.


Dimungkinkan juga untuk mengganti bagian yang cocok dengan fungsi. Fungsi semacam itu berguna ketika mengganti pembungkus teks sumber atau untuk menghitung, mengumpulkan, atau mendapatkan informasi lain tentang teks. Misalnya, ketika saya menggunakan panggilan fungsi saat mengganti, saya bisa menulis penyorotan sintaksis HTML.


Mari kita ubah semua alamat email dalam HURUF MODAL.


Dalam Python, fungsi ganti mendapat objek yang cocok. Kami menggunakan metode grup () untuk melakukan tindakan dengan teks yang cocok dan mengembalikannya sebagai pengganti:


 text = pattern.sub( lambda match: match.group(0).upper(), 'Say hi at hi@example.com', ) # text == 'Say hi at HI@EXAMPLE.COM' 

Di JS, fungsi ganti mendapatkan seluruh string yang cocok, kemunculan pertama, kedua, dll. Kami melakukan tindakan yang diperlukan dan mengembalikan garis yang dimodifikasi:


 text = 'Say hi at hi@example.com'.replace( pattern, function(match, p1, p2) { return match.toUpperCase(); } ); // text === 'Say hi at HI@EXAMPLE.COM' 

Menangani kesalahan


Berbeda dengan Python, JavaScript berbasis browser front-end biasanya tidak digunakan untuk menulis / membaca file atau mengakses database. Oleh karena itu, try..catch blok cukup jarang di JS dibandingkan dengan try..except blok dalam Python.


Namun, dalam hal apa pun, penanganan kesalahan dapat dilakukan dalam skrip pengguna, dipanggil dari fungsi pustaka, dan dicegat dalam kode utama.


Dalam contoh MyException berikut, kami akan mendefinisikan MyException kami, MyException dalam suatu fungsi, dan melihat bagaimana menangkapnya dan menanganinya di blok try..except..finally :


 class MyException(Exception): def __init__(self, message): self.message = message def __str__(self): return self.message def proceed(): raise MyException('Error happened!') try: proceed() except MyException as err: print('Sorry! {}'.format(err)) finally: print('Finishing') 

Kode JS berikut melakukan hal yang sama - kami mendefinisikan kelas MyException , MyException dalam suatu fungsi, mencegat dan memprosesnya dalam try..catch..finally blokir:


 function MyException(message) { this.message = message; this.toString = function() { return this.message; } } function proceed() { throw new MyException('Error happened!'); } try { proceed(); } catch (err) { if (err instanceof MyException) { console.log('Sorry! ' + err); } } finally { console.log('Finishing'); } 

Dalam kedua bahasa, kelas MyException memiliki parameter message dan metode untuk representasi string tergantung pada nilai message .


Tentu saja, pengecualian harus dilemparkan / dinaikkan hanya jika terjadi kesalahan. Dan jika Anda telah mengidentifikasi kesalahan ini dalam modul Anda.


Kesimpulan


  • Melakukan serialisasi ke / dari JSON cukup mudah - apa yang ada di Python, apa yang ada di JS.
  • Reguler adalah alat pengolah kata yang kuat dalam kedua bahasa.
  • Anda dapat membuat penggantian menggunakan fungsi.
  • Untuk kasus yang lebih kompleks, Anda dapat menggunakan panggilan, intersepsi, dan penanganan kesalahan.

Seperti yang dikatakan terakhir kali, Anda dapat mencocokkan baris demi baris contoh-contoh kode yang disediakan di sini untuk memahami struktur data yang sama dan metode-metode bekerja dengan mereka: string, array, kamus, akses ke objek.


Di bagian selanjutnya, kita akan berbicara tentang pola teks, membongkar daftar, fungsi lambda, iterasi tanpa menggunakan indeks, generator, dan set.

Source: https://habr.com/ru/post/id417513/


All Articles