Lebih
Apa `1..__truediv__` ? Tidak Python memiliki .. ("dot dot") notasi sintaks?
Saya baru-baru menemukan sebuah sintaks yang tidak pernah aku lihat sebelumnya ketika saya belajar python atau dalam kebanyakan tutorial, ..
notasi, terlihat sesuatu seperti ini:
f = 1..__truediv__ # or 1..__div__ for python 2
print(f(8)) # prints 0.125
Saya pikir itu adalah persis sama seperti (kecuali's lagi, tentu saja):
f = lambda x: (1).__truediv__(x)
print(f(8)) # prints 0.125 or 1//8
Tapi pertanyaan saya adalah:
- Bagaimana anda bisa melakukan itu?
- Apa sebenarnya artinya dengan dua titik?
- Bagaimana anda bisa menggunakannya dalam bentuk yang lebih kompleks pernyataan (jika mungkin)?
Ini mungkin akan menghemat saya banyak baris kode di masa depan...:)
189
4
Apa yang anda miliki adalah
float
literal tanpa trailing zero, yang kemudian anda mengakses__truediv__
metode. It's tidak operator itu sendiri; pertama dot adalah bagian dari float nilai, dan yang kedua adalah operator dot untuk mengakses objek properti dan metode.Anda dapat mencapai titik yang sama dengan melakukan hal berikut.
Contoh lain
Di sini kita tambahkan 1.0 ke 2.0, yang jelas hasil 3.0.
Pertanyaannya adalah sudah cukup menjawab (yaitu @Paul Rooneys jawaban) tapi itu's juga memungkinkan untuk memverifikasi kebenaran dari jawaban-jawaban ini.
Mari saya rekap yang ada jawaban:
..
tidak satu sintaks elemen!Anda dapat memeriksa bagaimana kode sumber "tokenized". Token ini mewakili berapa kode ditafsirkan:
Jadi string
1.
diartikan sebagai jumlah, kedua.
adalah OP (operator, dalam hal ini "mendapatkan atribut" operator) dan__truediv__
adalah nama metode. Jadi, ini adalah hanya mengakses__truediv__
metode float1.0
.Cara lain untuk melihat bytecode yang dihasilkan adalah `dis'assemble hal. Ini benar-benar menunjukkan instruksi yang dilakukan ketika beberapa kode dieksekusi:
Yang pada dasarnya mengatakan hal yang sama. Itu banyak atribut
__truediv__
konstan1.0
.Mengenai pertanyaan anda
Meskipun itu's mungkin anda harus menulis kode seperti itu, hanya karena itu's tidak jelas apa kode lakukan. Jadi silakan don't menggunakannya di lebih kompleks pernyataan. Aku bahkan akan pergi sejauh yang anda tidak't menggunakannya dalam "mudah" pernyataan, setidaknya anda harus menggunakan tanda kurung untuk memisahkan petunjuk:
ini akan pasti lebih mudah dibaca - tapi sesuatu di sepanjang baris:
akan lebih baik!
Dengan menggunakan pendekatan
parsial
juga menjaga python's model data (1..__truediv__ pendekatan
tidak!) yang dapat ditunjukkan oleh ini sedikit cuplikan:Hal ini karena
1. / (1+2j)
adalah tidak dievaluasi olehfloat.__truediv__
, tapi dengankompleks.__rtruediv__
-operator.truediv
memastikan operasi sebaliknya disebut saat operasi normal kembaliNotImplemented
tapi anda don't memiliki fallbacks ketika anda beroperasi pada__truediv__
ini diatas. Ini kehilangan "perilaku yang diharapkan" adalah alasan utama mengapa anda (biasanya) tidak't menggunakan metode sihir ini diatas.Dua titik bersama-sama mungkin sedikit canggung pada awalnya:
Tapi itu adalah sama seperti menulis:
Karena
float
literal dapat ditulis dalam tiga bentuk:f
adalah terikat metode khusus di lampung dengan nilai satu. Secara khusus,di Python 3, memanggil:
Bukti:
dan:
Jika kita lakukan:
Kami mempertahankan nama terikat yang terikat metode
Jika kita melakukan itu dihiasi lookup di sebuah lingkaran yang ketat, hal ini bisa sedikit menghemat waktu.
Parsing Abstrak Pohon Sintaks (AST)
Kita dapat melihat bahwa parsing AST untuk ekspresi memberitahu kita bahwa kita mendapatkan
__truediv__
atribut pada angka floating point,1.0
:Anda bisa mendapatkan hal yang sama sehingga fungsi dari:
Atau
Deduksi
Kita juga bisa mendapatkan di sana dengan deduksi.
Let's membangunnya.
1 dengan sendirinya adalah sebuah
int
:1 dengan periode setelah itu adalah float:
Titik berikutnya dengan sendirinya akan menjadi SyntaxError, tapi itu mulai putus-putus lookup pada contoh float:
Tidak ada orang lain telah disebutkan ini Ini "terikat metode" di the float,
1.0
:Kita bisa mencapai fungsi yang sama jauh lebih readably:
Kinerja
Kelemahan dari
divide_one_by
fungsi adalah bahwa hal itu memerlukan yang lain Python stack frame, sehingga agak lebih lambat daripada terikat metode:Tentu saja, jika anda hanya bisa menggunakan plain literal, yang's bahkan lebih cepat: