Saya berlatih menggunakan petunjuk tipe di Python 3.5. Salah satu kolega saya menggunakan typing.Dict
:
import typing
def change_bandwidths(new_bandwidths: typing.Dict,
user_id: int,
user_name: str) -> bool:
print(new_bandwidths, user_id, user_name)
return False
def my_change_bandwidths(new_bandwidths: dict,
user_id: int,
user_name: str) ->bool:
print(new_bandwidths, user_id, user_name)
return True
def main():
my_id, my_name = 23, "Tiras"
simple_dict = {"Hello": "Moon"}
change_bandwidths(simple_dict, my_id, my_name)
new_dict = {"new": "energy source"}
my_change_bandwidths(new_dict, my_id, my_name)
if __name__ == "__main__":
main()
Keduanya berfungsi dengan baik, sepertinya tidak ada perbedaan.
Saya telah membaca typing
dokumentasi modul .
Di antara typing.Dict
atau dict
mana yang harus saya gunakan dalam program ini?
def a(b: int) -> bool:
ini adalah kesalahan sintaks di Python 2.7, dan saya pikir itu adalah kesalahan sintaks di versi lama Python 3 juga.Jawaban:
Tidak ada perbedaan nyata antara menggunakan file biasa
typing.Dict
dandict
, tidak.Namun,
typing.Dict
adalah tipe Generik * yang memungkinkan Anda menentukan jenis kunci dan nilai juga , membuatnya lebih fleksibel:def change_bandwidths(new_bandwidths: typing.Dict[str, str], user_id: int, user_name: str) -> bool:
Dengan demikian, bisa jadi di beberapa titik dalam masa proyek Anda, Anda ingin mendefinisikan argumen kamus sedikit lebih tepat, di mana perluasan
typing.Dict
ketyping.Dict[key_type, value_type]
adalah perubahan 'lebih kecil' daripada menggantidict
.Anda dapat membuatnya lebih umum dengan menggunakan
Mapping
atauMutableMapping
ketik di sini; karena fungsi Anda tidak perlu mengubah pemetaan, saya akan tetap menggunakannyaMapping
. Adict
adalah satu pemetaan, tetapi Anda dapat membuat objek lain yang juga memenuhi antarmuka pemetaan, dan fungsi Anda mungkin masih berfungsi dengan itu:def change_bandwidths(new_bandwidths: typing.Mapping[str, str], user_id: int, user_name: str) -> bool:
Sekarang Anda jelas mengatakan pengguna lain dari fungsi ini bahwa kode Anda tidak akan benar-benar mengubah yang
new_bandwidths
pemetaan berlalu di.Implementasi Anda yang sebenarnya hanya mengharapkan objek yang dapat dicetak. Itu mungkin implementasi uji coba, tetapi seperti yang ada, kode Anda akan terus berfungsi jika Anda menggunakannya
new_bandwidths: typing.Any
, karena objek apa pun di Python dapat dicetak.* : Catatan: Jika Anda menggunakan Python 3.7 atau yang lebih baru, Anda dapat menggunakan
dict
sebagai tipe generik jika Anda memulai modul Anda denganfrom __future__ import annotations
, dan mulai dari Python 3.9,dict
(serta wadah standar lainnya) mendukung digunakan sebagai tipe generik bahkan tanpa itu direktif .sumber
{"name": "bob", "age" : 51}
, apakah itu sepertityping.Mapping[Union[str, int]
? Bagaimana dengan kamus bersarang seperti{"person": {"name":"bob", "age": 51}
apakah itu seperti itutyping.Mapping[str, typing.Mapping[Union[str, int]]
? MenggunakanUnion
seperti itu mengganggu saya karena ini bukan skema yang ketat karena tidak ada pemesanan. Mungkin tidak apa-apa, atau apakah ada alternatif?Union
pertanyaan Saya melihat itu masih diskusi terbuka github.com/python/typing/issues/28typing.Dict
adalah versi umum daridict
:Di sini Anda dapat menentukan jenis kunci dan nilai di dict:
Dict[str, int]
sumber