Saya melihat beberapa kode Python yang menggunakan @
simbol, tapi saya tidak tahu apa fungsinya. Saya juga tidak tahu apa yang harus dicari sebagai pencarian Python docs atau Google tidak memberikan hasil yang relevan ketika @
simbol disertakan.
python
syntax
python-decorators
AJ00200
sumber
sumber
Contoh
Ini menunjukkan bahwa
function
/method
/class
Anda mendefinisikan setelah dekorator hanya pada dasarnya diteruskan sebagaiargument
kefunction
/method
segera setelah@
tanda.Penampakan pertama
The microframework Flask memperkenalkan dekorator dari awal dalam format berikut:
Ini pada gilirannya berarti:
Menyadari hal ini akhirnya membuat saya merasa damai dengan Flask.
sumber
app.route("/")
: fungsi ini mengembalikan fungsi, yang Anda menjalankan dengan Andahello()
sebagai argumenapp.route("/", hello)
segera setelah mendefinisikanhello
, atau bahkan mendefinisikanhello
sebagai lambda dalam argumenapp.route
? (Contoh terakhir adalah umum dengan Node.jshttp.Server
dan rute Express.)Cuplikan kode ini:
Setara dengan kode ini:
Dalam definisi dekorator Anda dapat menambahkan beberapa hal yang dimodifikasi yang tidak akan dikembalikan oleh fungsi secara normal.
sumber
Dalam Python 3.5 Anda dapat membebani
@
sebagai operator. Disebut sebagai__matmul__
, karena dirancang untuk melakukan perkalian matriks, tetapi bisa berupa apa saja yang Anda inginkan. Lihat PEP465 untuk detailnya.Ini adalah implementasi sederhana dari perkalian matriks.
Kode ini menghasilkan:
sumber
@=
operator (di tempat), yaitu__imatmul__
.__add__
dan__sub__
terhubung ke + dan - masing-masing, tetapi tidak pernah mendengar@
tanda itu sebelumnya. Apakah ada orang lain yang bersembunyi di luar sana?Apa yang dilakukan simbol "at" (@) dengan Python?
Singkatnya, ini digunakan dalam sintaksis dekorator dan untuk perkalian matriks.
Dalam konteks dekorator, sintaks ini:
setara dengan ini:
Dalam konteks perkalian matriks,
a @ b
aktifkana.__matmul__(b)
- buat sintaks ini:setara dengan
dan
setara dengan
di mana
dot
, misalnya, fungsi perkalian matriks numpy dana
danb
adalah matriks.Bagaimana Anda bisa menemukan ini sendiri?
Jika Anda ingin memiliki pandangan yang agak lengkap tentang apa yang dilakukan sintaks python tertentu, lihat langsung pada file grammar. Untuk cabang Python 3:
Kita dapat melihat di sini yang
@
digunakan dalam tiga konteks:Sintaks dekorator:
Pencarian google untuk "dekorator python docs" memberikan sebagai salah satu hasil teratas, bagian "Pernyataan Majemuk" dari "Referensi Bahasa Python." Menggulir ke bawah ke bagian definisi fungsi , yang dapat kita temukan dengan mencari kata, "dekorator", kita melihat bahwa ... ada banyak yang harus dibaca. Tetapi kata, "dekorator" adalah tautan ke glosarium , yang memberi tahu kita:
Jadi, kita lihat itu
secara semantik sama dengan:
Mereka tidak persis sama karena Python mengevaluasi ekspresi foo (yang bisa berupa pencarian titik-titik dan panggilan fungsi) sebelum bilah dengan
@
sintaks dekorator ( ), tetapi mengevaluasi ekspresi foo setelah bilah dalam kasus lain.(Jika perbedaan ini membuat perbedaan dalam arti kode Anda, Anda harus mempertimbangkan kembali apa yang Anda lakukan dengan hidup Anda, karena itu akan menjadi patologis.)
Dekorator Tertumpuk
Jika kita kembali ke dokumentasi sintaks definisi fungsi, kita melihat:
Ini adalah demonstrasi yang dapat kita sebut fungsi yang merupakan dekorator terlebih dahulu, serta dekorator tumpukan. Functions, dalam Python, adalah objek kelas satu - yang berarti Anda bisa melewatkan fungsi sebagai argumen ke fungsi lain, dan mengembalikan fungsi. Dekorator melakukan kedua hal ini.
Jika kita menumpuk dekorator, fungsinya, seperti yang didefinisikan, akan diteruskan terlebih dahulu ke dekorator tepat di atasnya, lalu berikutnya, dan seterusnya.
Itu tentang merangkum penggunaan
@
dalam konteks dekorator.Operator,
@
Di bagian analisis leksikal dari referensi bahasa, kami memiliki bagian tentang operator , yang termasuk
@
, yang menjadikannya juga operator:dan di halaman berikutnya, Model Data, kita memiliki bagian Mengemulasi Jenis Numerik ,
Dan kita melihat itu
__matmul__
sesuai dengan@
. Jika kita mencari dokumentasi untuk "matmul" kita mendapatkan tautan ke Apa yang baru di Python 3.5 dengan "matmul" di bawah judul "PEP 465 - Operator infiks khusus untuk perkalian matriks".(Jadi sekarang kita belajar bahwa itu
@=
adalah versi di tempat). Lebih lanjut dijelaskan:Meskipun operator ini dapat kelebihan beban untuk melakukan hampir semua hal,
numpy
misalnya, kami akan menggunakan sintaks ini untuk menghitung produk dalam dan luar dari susunan dan matriks:Multiplikasi matriks inplace:
@=
Saat meneliti penggunaan sebelumnya, kami belajar bahwa ada juga perkalian matriks inplace. Jika kami mencoba menggunakannya, kami mungkin menemukan itu belum diterapkan untuk numpy:
Ketika diimplementasikan, saya berharap hasilnya akan terlihat seperti ini:
sumber
Simbol @ adalah python gula sintaksis menyediakan untuk memanfaatkan
decorator
,untuk parafrase pertanyaan, Ini persis tentang apa yang dekorator lakukan di Python?
Sederhananya
decorator
memungkinkan Anda untuk mengubah definisi fungsi yang diberikan tanpa menyentuh yang paling dalam (itu penutupan).Ini adalah kasus terbanyak ketika Anda mengimpor paket luar biasa dari pihak ketiga. Anda dapat memvisualisasikannya, Anda dapat menggunakannya, tetapi Anda tidak dapat menyentuh bagian terdalam dan hatinya.
Berikut ini adalah contoh cepat,
misalkan saya mendefinisikan
read_a_book
fungsi di IpythonAnda lihat, saya lupa menambahkan nama untuk itu.
Bagaimana mengatasi masalah seperti itu? Tentu saja, saya dapat mendefinisikan kembali fungsi sebagai:
Namun demikian, bagaimana jika saya tidak diizinkan untuk memanipulasi fungsi asli, atau jika ada ribuan fungsi yang harus ditangani.
Selesaikan masalah dengan berpikir berbeda dan tentukan fungsi baru
Kemudian gunakan itu.
Tada, Anda tahu, saya diam
read_a_book
tanpa menyentuhnya dengan penutupan batin. Tidak ada yang menghentikan saya dilengkapidecorator
.Tentang apa
@
@add_a_book
adalah cara yang mewah dan praktis untuk mengatakanread_a_book = add_a_book(read_a_book)
, ini adalah gula sintaksis, tidak ada yang lebih menarik dari itu.sumber
Jika Anda merujuk pada beberapa kode dalam buku catatan python yang menggunakan Numpy library, maka
@ operator
artinya Penggandaan Matriks . Sebagai contoh:sumber
Dimulai dengan Python 3.5, '@' digunakan sebagai simbol infiks khusus untuk MATRIX MULTIPLICATION (PEP 0465 - lihat https://www.python.org/dev/peps/pep-0465/ )
sumber
Dekorator ditambahkan dengan Python untuk membuat pembungkus fungsi dan metode (fungsi yang menerima fungsi dan mengembalikan fungsi yang ditingkatkan) lebih mudah dibaca dan dipahami. Kasus penggunaan asli adalah untuk dapat mendefinisikan metode sebagai metode kelas atau metode statis di kepala definisi mereka. Tanpa sintaksis dekorator, diperlukan definisi yang agak jarang dan berulang:
Jika sintaksis dekorator digunakan untuk tujuan yang sama, kode lebih pendek dan lebih mudah dipahami:
Sintaksis umum dan kemungkinan implementasi
Dekorator umumnya adalah objek bernama ( ekspresi lambda tidak diizinkan ) yang menerima argumen tunggal ketika dipanggil (itu akan menjadi fungsi yang didekorasi) dan mengembalikan objek yang dapat dipanggil lainnya. "Callable" digunakan di sini alih-alih "berfungsi" dengan perencanaan terlebih dahulu. Sementara dekorator sering dibahas dalam ruang lingkup metode dan fungsi, mereka tidak terbatas pada mereka. Bahkan, apa pun yang dapat dipanggil (objek apa pun yang mengimplementasikan metode _call__ dianggap callable), dapat digunakan sebagai dekorator dan seringkali objek yang dikembalikan oleh mereka bukanlah fungsi sederhana tetapi lebih banyak contoh kelas yang lebih kompleks yang menerapkan metode __call_ mereka sendiri.
Sintaksis dekorator hanyalah gula sintaksis . Pertimbangkan penggunaan dekorator berikut:
Ini selalu dapat digantikan oleh panggilan dekorator dan pengalihan fungsi secara eksplisit:
Namun, yang terakhir kurang dapat dibaca dan juga sangat sulit untuk dipahami jika beberapa dekorator digunakan pada satu fungsi. Dekorator dapat digunakan dalam berbagai cara seperti yang ditunjukkan di bawah ini:
Sebagai fungsi
Ada banyak cara untuk menulis dekorator khusus, tetapi cara paling sederhana adalah menulis fungsi yang mengembalikan subfungsi yang membungkus panggilan fungsi asli.
Pola generik adalah sebagai berikut:
Sebagai kelas
Sementara dekorator hampir selalu dapat diimplementasikan menggunakan fungsi, ada beberapa situasi ketika menggunakan kelas yang ditentukan pengguna adalah pilihan yang lebih baik. Ini sering benar ketika dekorator membutuhkan parametrization yang kompleks atau tergantung pada keadaan tertentu.
Pola umum untuk dekorator nonparametrized sebagai kelas adalah sebagai berikut:
Dekorator parametrizing
Dalam kode sebenarnya, sering kali ada kebutuhan untuk menggunakan dekorator yang dapat parametrized. Ketika fungsi tersebut digunakan sebagai dekorator, maka solusinya sederhana — pembungkus tingkat kedua harus digunakan. Berikut ini adalah contoh sederhana dari dekorator yang mengulangi pelaksanaan fungsi yang didekorasi berapa kali setiap kali dipanggil:
Dekorator yang ditentukan dengan cara ini dapat menerima parameter:
Perhatikan bahwa bahkan jika dekorator parametrized memiliki nilai default untuk argumennya, tanda kurung setelah namanya diperlukan. Cara yang benar untuk menggunakan dekorator sebelumnya dengan argumen default adalah sebagai berikut:
Akhirnya mari kita lihat dekorator dengan Properties.
Properti
Properti menyediakan tipe deskriptor bawaan yang tahu cara menautkan atribut ke serangkaian metode. Properti mengambil empat argumen opsional: fget, fset, fdel, dan doc. Yang terakhir dapat disediakan untuk mendefinisikan docstring yang dihubungkan dengan atribut seolah-olah itu adalah metode. Berikut adalah contoh kelas Rectangle yang dapat dikontrol baik dengan akses langsung ke atribut yang menyimpan dua titik sudut atau dengan menggunakan properti width, dan height:
Sintaks terbaik untuk membuat properti menggunakan properti sebagai dekorator. Ini akan mengurangi jumlah tanda tangan metode di dalam kelas dan membuat kode lebih mudah dibaca dan dipelihara . Dengan dekorator, kelas di atas menjadi:
sumber
Untuk mengatakan apa yang orang lain miliki dengan cara yang berbeda: ya, itu adalah dekorator.
Dalam Python, itu seperti:
Ini dapat digunakan untuk semua jenis hal yang bermanfaat, dimungkinkan karena fungsi adalah objek dan hanya diperlukan instruksi saja.
sumber
@ Simbol ini juga digunakan untuk variabel akses di dalam plydata / panda dataframe query,
pandas.DataFrame.query
. Contoh:sumber
Ini menunjukkan bahwa Anda menggunakan dekorator. Ini adalah contoh Bruce Eckel dari 2008.
sumber