Jawaban lain telah melakukan pekerjaan yang baik dalam menjelaskan mengetik bebek dan jawaban sederhana oleh tzot :
Python tidak memiliki variabel, seperti bahasa lain di mana variabel memiliki tipe dan nilai; memiliki nama yang menunjuk ke objek, yang tahu tipenya.
Namun , satu hal yang menarik telah berubah sejak 2010 (ketika pertanyaan pertama kali ditanyakan), yaitu implementasi PEP 3107 (diimplementasikan dalam Python 3). Anda sekarang dapat benar-benar menentukan jenis parameter dan jenis jenis pengembalian fungsi seperti ini:
def pick(l: list, index: int) -> int:
return l[index]
Di sini kita dapat melihat bahwa pick
dibutuhkan 2 parameter, daftar l
dan bilangan bulat index
. Ini juga harus mengembalikan integer.
Jadi di sini tersirat bahwa l
adalah daftar bilangan bulat yang dapat kita lihat tanpa banyak usaha, tetapi untuk fungsi yang lebih kompleks dapat sedikit membingungkan mengenai apa yang harus dimasukkan dalam daftar. Kami juga ingin nilai default index
menjadi 0. Untuk menyelesaikan ini, Anda dapat memilih untuk menulis pick
seperti ini sebagai gantinya:
def pick(l: "list of ints", index: int = 0) -> int:
return l[index]
Perhatikan bahwa kita sekarang memasukkan string sebagai tipe l
, yang diizinkan secara sintaksis, tetapi tidak baik untuk parsing secara terprogram (yang akan kita bahas nanti).
Penting untuk dicatat bahwa Python tidak akan menaikkan TypeError
jika Anda melayangkan float ke dalam index
, alasan untuk ini adalah salah satu poin utama dalam filosofi desain Python: "Kita semua menyetujui orang dewasa di sini" , yang berarti Anda diharapkan untuk Waspadai apa yang bisa Anda berikan ke suatu fungsi dan apa yang tidak bisa Anda lakukan. Jika Anda benar-benar ingin menulis kode yang melempar TypeErrors Anda dapat menggunakan isinstance
fungsi untuk memeriksa bahwa argumen yang dikirimkan adalah tipe yang tepat atau subkelasnya seperti ini:
def pick(l: list, index: int = 0) -> int:
if not isinstance(l, list):
raise TypeError
return l[index]
Lebih lanjut tentang mengapa Anda jarang melakukan ini dan apa yang harus Anda lakukan malah dibicarakan di bagian selanjutnya dan di komentar.
PEP 3107 tidak hanya meningkatkan keterbacaan kode tetapi juga memiliki beberapa kasus penggunaan pas yang dapat Anda baca di sini .
Jenis anotasi mendapat lebih banyak perhatian di Python 3.5 dengan pengenalan PEP 484 yang memperkenalkan modul standar untuk petunjuk jenis.
Petunjuk tipe ini berasal dari tipe checker mypy ( GitHub ), yang sekarang sesuai dengan PEP 484 .
Dengan modul pengetikan hadir dengan koleksi petunjuk jenis yang cukup komprehensif, termasuk:
List
, Tuple
, Set
, Map
- untuk list
, tuple
, set
dan map
masing-masing.
Iterable
- berguna untuk generator.
Any
- saat itu bisa apa saja.
Union
- ketika itu bisa berupa apa saja di dalam set jenis tertentu, sebagai lawan Any
.
Optional
- saat itu mungkin Tidak Ada. Singkatan untuk Union[T, None]
.
TypeVar
- Digunakan dengan obat generik.
Callable
- Digunakan terutama untuk fungsi, tetapi dapat digunakan untuk callable lainnya.
Ini adalah petunjuk jenis yang paling umum. Daftar lengkap dapat ditemukan dalam dokumentasi untuk modul pengetikan .
Berikut ini adalah contoh lama menggunakan metode penjelasan yang diperkenalkan dalam modul pengetikan:
from typing import List
def pick(l: List[int], index: int) -> int:
return l[index]
Salah satu fitur yang kuat adalah Callable
yang memungkinkan Anda mengetik metode anotasi yang mengambil fungsi sebagai argumen. Sebagai contoh:
from typing import Callable, Any, Iterable
def imap(f: Callable[[Any], Any], l: Iterable[Any]) -> List[Any]:
"""An immediate version of map, don't pass it any infinite iterables!"""
return list(map(f, l))
Contoh di atas bisa menjadi lebih tepat dengan penggunaan TypeVar
alih - alih Any
, tetapi ini telah dibiarkan sebagai latihan bagi pembaca karena saya yakin saya sudah mengisi jawaban saya dengan terlalu banyak informasi tentang fitur-fitur baru yang luar biasa yang diaktifkan dengan mengetikkan petunjuk.
Sebelumnya ketika seseorang mendokumentasikan kode Python dengan Sphinx misalnya beberapa fungsi di atas dapat diperoleh dengan menulis dokumen yang diformat seperti ini:
def pick(l, index):
"""
:param l: list of integers
:type l: list
:param index: index at which to pick an integer from *l*
:type index: int
:returns: integer at *index* in *l*
:rtype: int
"""
return l[index]
Seperti yang Anda lihat, ini membutuhkan sejumlah baris tambahan (jumlah pastinya tergantung pada seberapa eksplisit Anda ingin menjadi dan bagaimana Anda memformat dokumen Anda). Tetapi sekarang harus jelas bagi Anda bagaimana PEP 3107 memberikan alternatif yang dalam banyak hal (semua?) Lebih unggul. Hal ini terutama berlaku dalam kombinasi dengan PEP 484 yang, seperti telah kita lihat, menyediakan modul standar yang mendefinisikan sintaks untuk jenis petunjuk / anotasi yang dapat digunakan sedemikian rupa sehingga tidak ambigu dan tepat namun fleksibel, membuat untuk kombinasi yang kuat.
Menurut pendapat pribadi saya, ini adalah salah satu fitur terbesar di Python. Saya tidak sabar menunggu orang mulai memanfaatkan kekuatannya. Maaf untuk jawaban yang panjang, tapi inilah yang terjadi ketika saya bersemangat.
Contoh kode Python yang banyak menggunakan tipe hinting dapat ditemukan di sini .