Saya baru-baru ini memperhatikan sesuatu yang menarik ketika melihat spesifikasi tata bahasa Python 3.3 :
funcdef: 'def' NAME parameters ['->' test] ':' suite
Blok 'panah' opsional tidak ada di Python 2 dan saya tidak dapat menemukan informasi mengenai artinya dalam Python 3. Ternyata ini adalah Python yang benar dan diterima oleh juru bahasa:
def f(x) -> 123:
return x
Saya berpikir bahwa ini mungkin semacam sintaksis prasyarat, tetapi:
- Saya tidak dapat menguji di
x
sini, karena masih belum ditentukan, - Tidak peduli apa yang saya masukkan setelah panah (misalnya
2 < 1
), itu tidak mempengaruhi perilaku fungsi.
Adakah yang bisa terbiasa dengan sintaks ini menjelaskannya?
.__annotations__
atribut.__annotations__
atributnya adalah kamus. Kuncinyareturn
adalah yang digunakan untuk mengambil nilai setelah panah.Ini adalah penjelasan fungsi yang tercakup dalam PEP 3107 . Secara khusus,
->
menandai anotasi fungsi pengembalian.Contoh:
Anotasi adalah kamus, sehingga Anda dapat melakukan ini:
Anda juga dapat memiliki struktur data python daripada hanya string:
Atau, Anda bisa menggunakan atribut fungsi untuk memvalidasi nilai yang disebut:
Cetakan
sumber
Seperti jawaban lain telah menyatakan,
->
simbol digunakan sebagai bagian dari penjelasan fungsi. Namun, dalam versi Python yang lebih baru>= 3.5
, ia memiliki makna yang jelas .PEP 3107 - Anotasi Fungsi mendeskripsikan spesifikasi, mendefinisikan perubahan tata bahasa, keberadaan
func.__annotations__
penyimpanannya, dan fakta bahwa use case-nya masih terbuka.Dalam Python
3.5
, PEP 484 - Type Hints melampirkan arti tunggal untuk ini:->
digunakan untuk menunjukkan jenis fungsi yang dikembalikan. Sepertinya ini juga akan diberlakukan di versi mendatang seperti yang dijelaskan dalam Bagaimana dengan penggunaan anotasi yang ada :(Penekanan milikku)
Ini belum benar-benar dilaksanakan
3.6
sejauh yang saya tahu sehingga mungkin akan terbentur ke versi masa depan.Menurut ini, contoh yang Anda berikan:
akan dilarang di masa mendatang (dan dalam versi saat ini akan membingungkan), itu perlu diubah menjadi:
untuk itu secara efektif menggambarkan fungsi yang
f
mengembalikan objek bertipeint
.Anotasi tidak digunakan dengan cara apa pun oleh Python sendiri, cukup banyak mengisi dan mengabaikannya. Terserah perpustakaan pihak ketiga untuk bekerja dengannya.
sumber
Dalam kode berikut:
yang
-> int
hanya mengatakan bahwaf()
mengembalikan integer (tetapi tidak memaksa fungsi untuk mengembalikan integer). Ini disebut anotasi pengembalian , dan dapat diakses sebagaif.__annotations__['return']
.Python juga mendukung anotasi parameter:
: float
memberi tahu orang yang membaca program (dan beberapa perpustakaan / program pihak ketiga, misalnya pylint) yangx
seharusnya afloat
. Ini diakses sebagaif.__annotations__['x']
, dan tidak memiliki arti apa pun dengan sendirinya. Lihat dokumentasi untuk informasi lebih lanjut:https://docs.python.org/3/reference/compound_stmts.html#function-definitions https://www.python.org/dev/peps/pep-3107/
sumber
Ini berarti jenis hasil fungsi yang dikembalikan, tetapi bisa juga
None
.Ini tersebar luas di perpustakaan modern yang berorientasi pada Python 3.x.
Misalnya, ada dalam kode panda-profiling profil di banyak tempat misalnya:
sumber
def function(arg)->123:
Ini hanya tipe pengembalian, integer dalam hal ini tidak masalah nomor yang Anda tulis.
seperti Java :
Tapi untuk Python (bagaimana Jim Fasarakis Hilliard berkata) tipe kembali itu hanya petunjuk , jadi itu menyarankan pengembalian tetapi tetap mengizinkan untuk mengembalikan tipe lain seperti string ..
sumber
Ringkasan saya:
Secara sederhana
->
diperkenalkan untuk membuat pengembang menentukan secara spesifik jenis pengembalian fungsi. Lihat Proposal Peningkatan Python 3107Ini adalah indikasi tentang bagaimana hal-hal dapat berkembang di masa depan karena Python diadopsi secara luas - indikasi ke arah pengetikan yang kuat - ini adalah pengamatan pribadi saya.
Anda dapat menentukan jenis argumen juga. Menentukan tipe pengembalian fungsi dan argumen akan membantu mengurangi kesalahan logis dan meningkatkan peningkatan kode.
Anda dapat memiliki ekspresi sebagai tipe kembali (baik pada fungsi dan tingkat parameter) dan hasil dari ekspresi dapat diakses melalui atribut 'kembali' objek penjelasan . anotasi akan kosong untuk nilai ekspresi / pengembalian untuk fungsi inline lambda.
sumber