Di Python 3.8 yang baru dirilis ada anotasi tipe baru typing.TypedDict
. Dokumentasinya menyebutkan itu
Info jenis untuk introspeksi dapat diakses melalui
Point2D.__annotations__
danPoint2D.__total__
. [....]
Meskipun __annotations__
terkenal, telah diperkenalkan di PEP 3107 , saya tidak dapat menemukan informasi apa pun tentang __total__
. Adakah yang bisa menjelaskan maknanya dan jika mungkin menghubungkan ke sumber-sumber resmi?
python
python-3.x
python-typing
Antti Haapala
sumber
sumber
typing
internal tidak didokumentasikan, dan bagian yang didokumentasikan dengan buruk.Jawaban:
Saya menduga bahwa
__total__
bidang menandakan apakah instance harus lengkap (default) atau tidak (semua bidang opsional). Saya memulai pencarian saya di PEP 589 , yang memperkenalkanTypedDict
dan menjelaskan totalitas seperti itu. Itu menggunakantotal
argumen, yang masuk akal untuk mengubah nama dunder-style untukclass
sintaks. Namun, saya tidak menemukan kapan penggantian nama terjadi.Melihat ke MyPy, yang merupakan pemeriksa tipe aktual yang peduli dengan anotasi ini, ada dokumentasi
TypedDict
dan totalitas yang serupa , tetapi sekali lagi tidak ada referensi ke sintaksis bawah. Menggali penerapannya menyebabkan lebih banyak kebingungan, sepertiTypedDictType
pada types.py tidak memiliki bidang total, tetapi terpisahitems
danrequired_keys
. Totalitas akan menyiratkan bahwaitems.keys()==required_keys
tetapi implementasi membuat asumsi yang berbeda, sepertican_be_false
mengandalkanitems
sendirian.total=False
seharusnya pada prinsipnya berartirequired_keys
kosong.Sumber CPython untuk _TypedDictMeta setidaknya mengungkapkan bahwa
total
argumen dan__total__
dunder adalah satu dan sama, meskipun sumber menggambarkanTypedDict
dirinya sebagai "dapat ditambahkan segera".sumber
can_be_false
masalahnya adalah bug MyPy, mungkin terkait dengan tidak merencanakan memiliki bidang opsional sejak awal.TypedDict
diterima dengan Python 3.8 melalui PEP 589 . Dari Python, tampaknya__total__
bendera boolean disetel keTrue
default:Seperti disebutkan dalam posting lain, perincian tentang metode ini terbatas dalam dokumen , tetapi tautan @Yann Vernier ke kode sumber CPython sangat menyarankan
__total__
terkait dengantotal
kata kunci baru yang diperkenalkan dengan Python 3.8 :Bagaimana cara kerjanya?
Sinopsis : secara default, semua kunci diperlukan saat instantiasi yang ditentukan
TypedDict
.total=False
mengesampingkan pembatasan ini dan memungkinkan kunci opsional. Lihat demonstrasi berikut.Diberikan
Pohon direktori pengujian:
Kode
File dalam direktori tes:
Demo
Jika kunci tidak ada, mypy akan mengeluh di commandline:
Pengaturan
total=False
memungkinkan kunci opsional:Lihat juga
TypedDict
dalam Python 3.8 oleh Real Pythontyping-extensions
paket untuk digunakanTypedDict
dalam Python 3.5, 3.6sumber