Tentang dekorator dengan Python

Halo semuanya!


Terjemahan artikel itu disiapkan untuk siswa kursus "Pengembang web dengan Python . " Apakah menarik untuk dikembangkan ke arah ini? Mendaftar untuk kursus Open Doors Day dan mengobrol langsung dengan guru: disiarkan online 23 Juli pukul 20:00 waktu Moskow!



Ketika Anda berlatih pemrograman dengan Python, Anda harus menemukan konsep seperti dekorator. Mereka adalah salah satu alat yang paling elegan dan sering digunakan di perpustakaan dan kerangka kerja modern. Dekorator adalah cara yang baik untuk merangkum banyak detail implementasi, meninggalkan antarmuka sederhana di permukaan.


Mari kita lihat contoh dekorator masuk sederhana yang memeriksa apakah pengguna masuk sebelum memberinya kesempatan untuk mengedit posting. Kemudian dekorator mengalihkan ke halaman login atau registrasi, dan kemudian dengan bantuan mengatur parameter dengan benar, kembali ke halaman yang sama setelah otentikasi berhasil. Untuk menggunakan fungsi ini, Anda hanya perlu menulis @login_required sebelum fungsi target.


@login_required def edit_post(post_id): ... 

Dekorator sangat mudah untuk dikerjakan, tetapi membuat dekorator bukanlah tugas yang mudah bahkan untuk programmer Python yang berpengalaman. Pada artikel ini, kita akan melihat langkah demi langkah bagaimana dekorator bekerja dengan Python.


Fungsi


Fungsinya juga disebut objek kelas satu di Python. Fungsinya sama dengan angka, daftar, dan string, seperti yang terlihat pada contoh berikut.


 >>> def foo(): ... return 1 ... >>> >>> foo() 1 >>> 

Fungsi memiliki namespace mereka sendiri, di mana mereka mencari nama variabel di tempat pertama ketika mereka terjadi di tubuh fungsi. Mari kita menulis fungsi sederhana untuk memahami perbedaan antara ruang lingkup global dan lokal.


 >>> >>> a_string = "This is a global variable" >>> >>> def foo(): ... print(locals()) ... >>> >>> print(globals()) {..., 'a_string': 'This is a global variable'} >>> >>> foo() # 2 {} >>> 

Lingkup fungsi sebagai variabel


Aturan lingkup dalam Python mengatakan bahwa ketika suatu variabel dibuat, variabel lokal baru selalu dibuat, tetapi akses ke variabel ditentukan dalam lingkup lokal ketika mencari semua area terdekat untuk mencocokkan nama variabel. Ini tidak berarti bahwa kita tidak dapat mengakses variabel global dari fungsi kita. Untuk menghasilkan variabel global, kami mengubah fungsi foo sebagai berikut:


 >>> >>> a_string = "This is a global variable" >>> >>> def foo(): ... print(a_string) #1 ... >>> >>> foo() This is a global variable >>> 

Seumur hidup variabel


Tidak hanya variabel yang hidup di namespace, tetapi mereka juga memiliki masa pakai, yang penting untuk diingat. Pertimbangkan contoh yang mengilustrasikan tidak hanya aturan ruang lingkup dan masalah yang dapat ditimbulkannya, tetapi juga bagaimana mereka berinteraksi dengan pemanggilan fungsi dan cara kerjanya dalam Python dan bahasa lainnya.


 >>> def foo(): ... x = 1 ... >>> foo() >>> >>> print(x) # 1 Traceback (most recent call last): ... NameError: name 'x' is not defined >>> 

Fungsi Bersarang


Anda dapat membuat fungsi bersarang dalam Python, yang berarti bahwa kita dapat mendeklarasikan fungsi di dalam fungsi, dan semua aturan ruang lingkup dan masa berlaku


 >>> >>> def outer(): ... x = 1 ... def inner(): ... print(x) # 1 ... inner() # 2 ... >>> outer() 1 >>> 

Dekorator


Penutupan yang mengambil fungsi sebagai parameter dan mengembalikan fungsi disebut dekorator. Pertimbangkan contoh dekorator yang berguna.


 >>> >>> def outer(some_func): ... def inner(): ... print("before some_func") ... ret = some_func() # 1 ... return ret + 1 ... return inner ... >>> def foo(): ... return 1 ... >>> decorated = outer(foo) # 2 >>> >>> decorated() before some_func 2 >>> 

Variabel yang didekorasi adalah versi foo yang didekorasi. Bahkan, kita bisa mengganti foo dengan versi yang didekorasi dan tidak mempelajari sintaks baru hanya dengan menetapkan ulang variabel yang berisi fungsi kita:


 >>> >>> foo = outer(foo) >>> >>> foo # doctest: +ELLIPSIS <function outer.<locals>.inner at 0x...> >>> 

Sekarang kami memiliki dekorator cantik untuk melacak panggilan fungsi. Dekorator dapat digunakan untuk bekerja dengan bahasa pemrograman apa pun menggunakan Python. Ini adalah alat yang sangat berguna, mekanisme kerja yang harus dipahami untuk menerapkannya dengan benar.

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


All Articles