PEP 3107 (Anotasi Fitur)

Halo semuanya. Saya memutuskan untuk sepenuhnya memahami anotasi Python dan pada saat yang sama menerjemahkan serangkaian PEP yang mendokumentasikan topik ini. Kita akan mulai dengan standar 3.X dan diakhiri dengan inovasi dengan python 3.8. Saya harus segera mengatakan bahwa PEP ini adalah salah satu yang paling mendasar dan bacaannya hanya berguna untuk pemula. Baiklah, mari kita pergi:


PEP 572 - Anotasi Fitur

Semangat3107
Judul:Penjelasan Fitur
Penulis:Collin Winter <collinwinter di google.com>, Tony Lownds <tony at lownds.com>
Status:Terakhir
Sebuah tipe:Standar
Dibuat:2-Des-2006
Versi python:3.0

Penjelasan untuk standar


PEP ini memperkenalkan sintaks untuk menambahkan anotasi sewenang-wenang (metadata) ke fungsi dalam Python.

Pembenaran


Fungsi dalam Python 2.x tidak memiliki cara bawaan untuk membubuhi keterangan parameter dan mengembalikan nilai. Untuk mengatasi kesenjangan ini, banyak alat dan perpustakaan telah muncul. Beberapa dari mereka menggunakan dekorator yang dijelaskan dalam PEP 318, sementara yang lain menganalisis fungsi docstring dan mencari informasi di sana.

PEP ini dirancang untuk memberikan cara standar tunggal untuk membubuhi keterangan fungsi untuk mengurangi kebingungan yang telah ada hingga saat ini disebabkan oleh variasi luas dalam mekanisme dan sintaksis.

Dasar-Dasar Anotasi Fitur


Sebelum kita mulai membahas anotasi fitur Python 3.0, mari kita bicara tentang fitur mereka secara umum:

  1. Penjelasan untuk parameter dan nilai pengembalian fungsi sepenuhnya opsional.
  2. Anotasi tidak lebih dari cara untuk mengaitkan ekspresi sewenang-wenang dengan bagian fungsi yang berbeda pada waktu kompilasi.

    Python sendiri tidak memperhatikan penjelasan. Satu-satunya hal adalah memungkinkan Anda untuk mengaksesnya, yang dijelaskan di bagian "Mendapatkan Akses ke Anotasi Fitur" di bawah ini.

    Anotasi hanya masuk akal ketika ditafsirkan oleh perpustakaan pihak ketiga. Mereka dapat melakukan apa pun yang mereka inginkan dengan anotasi fungsi. Misalnya, satu pustaka dapat menggunakan anotasi string untuk memberikan data referensi yang ditingkatkan, misalnya:

    def compile(source: "something compilable",
                filename: "where the compilable thing comes from",
                mode: "is this a single statement or a suite?"):
        ...

    Pustaka lain dapat menggunakan fungsi Python dan penjelasan metode untuk memeriksa pencocokan jenis. Pustaka ini dapat menggunakan anotasi untuk menunjukkan tipe input data apa yang diharapkannya dan tipe data apa yang akan dikembalikan. Mungkin akan menjadi seperti ini:

    def haul(item: Haulable, *vargs: PackAnimal) -> Distance:
        ...

    Kami ulangi sekali lagi: penjelasan dari tidak ada contoh dalam diri mereka memiliki setiap makna. Mereka memperoleh makna nyata hanya dalam kombinasi dengan perpustakaan pihak ketiga.
  3. Sebagai berikut dari paragraf 2, PEP ini tidak berusaha memperkenalkan mekanisme standar apa pun untuk memproses anotasi bahkan untuk tipe bawaan. Semua pekerjaan ini ditugaskan ke perpustakaan pihak ketiga.

Sintaksis


Parameter


Anotasi parameter adalah ekspresi opsional yang mengikuti nama parameter itu sendiri:

def foo (a: , b:  = 5):
    ...

Dalam pseudogrammatics, parameter sekarang terlihat seperti: parameter [: ekspresi] [= ekspresi] . Artinya, anotasi, seperti nilai default, adalah opsional dan selalu mendahului yang terakhir. Sama seperti tanda sama dengan yang digunakan untuk menunjukkan nilai default, tanda titik dua digunakan untuk anotasi. Semua ekspresi anotasi, seperti nilai default, dievaluasi ketika definisi fungsi dijalankan. Mendapatkan argumen "ekstra" (mis. * Args dan ** kwargs) memiliki sintaks yang sama:

def foo(*args: expression, **kwargs: expression):
    ...

Anotasi untuk parameter bersarang selalu mengikuti nama parameter, bukan braket terakhir. Anotasi dari setiap "nama" dalam parameter bersarang tidak diperlukan:

def foo((x1, y1: expression),
        (x2: expression, y2: expression)=(None, None)):
    ...

Nilai pengembalian


Sejauh ini, kami belum memberikan contoh tentang cara membuat anotasi tipe pengembalian fungsi. Ini dilakukan seperti ini:

def sum() -> expression:
    ...

Yaitu, literal -> dan beberapa jenis ekspresi sekarang dapat mengikuti daftar parameter. Seperti penjelasan parameter, ungkapan ini akan dievaluasi ketika definisi fungsi dijalankan.

Tata bahasa penuh deklarasi fungsi sekarang adalah sebagai berikut:

decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
decorators: decorator+
funcdef: [decorators] 'def' NAME parameters ['->' test] ':' suite
parameters: '(' [typedargslist] ')'
typedargslist: ((tfpdef ['=' test] ',')*
                ('*' [tname] (',' tname ['=' test])* [',' '**' tname]
                 | '**' tname)
                | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
tname: NAME [':' test]
tfpdef: tname | '(' tfplist ')'
tfplist: tfpdef (',' tfpdef)* [',']

Lambdas


Fungsi Lambda tidak mendukung anotasi. Tentu saja, sintaksis dapat dikoreksi dengan menambahkan kemampuan untuk "membungkus" argumen dalam tanda kurung, namun, diputuskan untuk tidak melakukan perubahan seperti itu, karena:

  1. Ini akan melanggar kompatibilitas ke belakang.
  2. Lambdas netral dan anonim menurut definisi
  3. Lambdas selalu dapat ditulis ulang sebagai fungsi


Dapatkan akses ke anotasi fitur


Setelah dikompilasi, anotasi fungsi tersedia melalui atribut __annotations__. Atribut ini adalah kamus yang dapat diubah yang membandingkan nama variabel dan nilai penjelasan yang ditunjukkan kepada mereka.

Kamus __notasi__ memiliki kunci "kembali" khusus. Kunci ini hanya ada jika anotasi juga telah ditentukan untuk nilai pengembalian fungsi. Misalnya, penjelasan berikut:

def foo (a: 'x', b: 5 + 6, c: list) -> max (2, 9):
    ...

Akan dikembalikan melalui atribut __annotations__ sebagai:

{'a': 'x',
 'b': 11,
 'c': list,
 'return': 9}

Nama kunci "kembali" dipilih karena tidak dapat bertentangan dengan nama parameter (setiap upaya untuk menggunakan kembali karena nama parameter akan menghasilkan pengecualian SyntaxError).

Atribut __annotations__ akan kosong jika fungsi tidak memiliki anotasi atau jika fungsi dibuat melalui ekspresi lambda.

Gunakan kasing


Selama diskusi anotasi, kami memeriksa beberapa opsi untuk penggunaannya. Beberapa di antaranya disajikan di sini dan dikelompokkan berdasarkan "kelas" informasi yang dikirimkan. Juga disertakan di sini adalah contoh produk dan paket yang ada yang dapat menggunakan anotasi.

  • Memberikan Informasi Jenis
    • Ketik cek
    • Kiat IDE tentang Jenis Argumen yang Diharapkan dan Dikembalikan
    • Fungsi overloading / fungsi generik [kurang-lebih] function overloading populer di bahasa lain dan terdiri dari keberadaan beberapa fungsi dengan nama yang sama, tetapi pada saat yang sama, jumlah parameter yang diterima oleh mereka bervariasi]
    • Menjembatani antara berbagai bahasa pemrograman
    • Adaptasi
    • Predikat fungsi logika
    • Memetakan permintaan basis data
    • Penguraian parameter RPC [sekitar. Marshaling adalah proses mengubah informasi yang disimpan dalam RAM ke dalam format yang cocok untuk penyimpanan atau transmisi. RPC - Panggilan Prosedur Jauh]
  • Memberikan informasi lain
    • Mendokumentasikan parameter dan mengembalikan nilai

Perpustakaan standar


Pydoc dan periksa modul


Modul pydoc akan menampilkan anotasi dalam informasi referensi fungsi. Modul inspeksi akan berubah dan akan mendukung anotasi.

Tautan ke PEP lain


Fungsi Tanda Tangan Objek


Objek tanda tangan fungsi harus memberikan penjelasan fungsi. Objek parameter dan hal-hal lain dapat berubah. [sekitar Tanda tangan (Signature) dari fungsi - bagian dari deklarasi umum, yang memungkinkan alat terjemahan untuk mengidentifikasi fungsi antara lain]

Penerapan


Implementasi referensi dimasukkan dalam cabang py3k (sebelumnya "p3yk") sebagai revisi 53170

Tawaran yang ditolak


  • BDFL [. ] , , : ยซ ยป
  • stdlib , , . .
  • , , .
  • Meskipun diskusi lebih lanjut, diputuskan untuk tidak membakukan mekanisme interaksi anotasi. Kesepakatan seperti itu pada tahap ini akan terlalu dini. Kami ingin mengizinkan perjanjian ini berkembang secara organik, berdasarkan situasi nyata, dan tidak mencoba memaksa setiap orang untuk menggunakan semacam skema yang dibuat-buat.

All Articles