Rumah > Artikel > pembangunan bahagian belakang > Amalan terbaik untuk petunjuk jenis dalam Python
Menggunakan bahasa dinamik adalah masa yang tepat, dan kod itu dibina semula di krematorium. Saya percaya anda pasti pernah mendengar ayat ini Seperti ujian unit, walaupun memerlukan sedikit masa untuk menulis kod, ia sangat berbaloi untuk jangka masa panjang. Artikel ini berkongsi cara untuk memahami dan menggunakan pembayang jenis Python dengan lebih baik.
Petua jenis (diperkenalkan sejak PEP 3107) digunakan untuk menambah pembolehubah, parameter, parameter fungsi dan nilai pulangannya, atribut kelas dan kaedah menaip.
Jenis pembolehubah Python adalah dinamik dan boleh diubah suai pada masa jalan untuk menambah petunjuk jenis pada kod Ia hanya disokong pada tahap sintaks dan tidak mempunyai kesan ke atas perjalanan kod tersebut semasa menjalankan kod.
Oleh itu, fungsi intuitif petunjuk jenis adalah untuk meningkatkan kebolehbacaan kod, memudahkan pemanggil untuk menghantar parameter masuk/keluar daripada jenis yang sesuai, dan memudahkan pembinaan semula kod.
Jenis asas terbina dalam Python boleh digunakan terus untuk pembayang jenis:
Contoh pembayang jenis untuk pembolehubah:
a: int = 3 b: float = 2.4 c: bool = True d: list = ["A", "B", "C"] e: dict = {"x": "y"} f: set = {"a", "b", "c"} g: tuple = ("name", "age", "job")
Petua jenis untuk fungsi:
def add_numbers(x: type_x, y: type_y, z: type_z= 100) -> type_return: return x + y + z
Type_x, type_y, type_z, type_return di sini boleh menjadi jenis asas terbina dalam atau jenis tersuai. Taip petunjuk untuk kelas
:
class Person: first_name: str = "John" last_name: str = "Does" age: int = 31
Jika terdapat sekeping kod:
x: int = 2 x = 3.5
Tidak akan ada ralat semasa melaksanakan dengan penterjemah Python:
Dengan bantuan mypy, mula-mula pasang dengan pip install mypy, dan kemudian skrip mypy.py Itu sahaja:
Untuk lebih banyak maklumat berkaitan mypy, sila rujuk artikel sebelumnya mypy Alat ini menjadikan pembayang jenis Python sangat praktikal.
Jika jurubahasa tidak menguatkuasakan pembayang jenis, mengapa menulis pembayang jenis sama sekali? Memang benar bahawa pembayang jenis tidak mengubah cara kod anda berjalan: Python ditaip secara dinamik secara semula jadi, dan itu tidak mungkin berubah. Walau bagaimanapun, dari perspektif pengalaman pembangun, pembayang jenis mempunyai banyak faedah.
(1) Gunakan pembayang jenis, terutamanya dalam fungsi Pembayang jenis digunakan untuk menjelaskan jenis parameter dan jenis hasilnya, yang sangat mudah dibaca dan difahami.
(2) Petua taip menghapuskan overhed kognitif dan menjadikan kod lebih mudah dibaca dan nyahpepijat. Memandangkan jenis input dan output, anda boleh membuat kesimpulan dengan mudah objek dan cara ia dipanggil.
(3) Petua jenis boleh meningkatkan pengalaman penyuntingan kod. IDE boleh bergantung pada pemeriksaan jenis untuk menganalisis kod anda secara statik dan membantu mengesan kemungkinan ralat (cth., menghantar parameter jenis yang salah, memanggil kaedah yang salah, dsb.). Selain itu, autolengkap disediakan untuk setiap pembolehubah berdasarkan petunjuk jenis.
Semakan jenis IDE
Semakan jenis IDE
Pelengkapan automatik selepas semakan jenis IDE
Jika anda memerlukan pembayang jenis apungan di dalam senarai, ini tidak akan berfungsi:
def my_dummy_function(l: list[float]): return sum(l)
Penaipan perpustakaan standard mengambil kira masalah ini, anda boleh melakukan ini:
from typing import List def my_dummy_function(vector: List[float]): return sum(vector)
Jika anda ingin meminta jenis sedemikian:
my_dict = {"name": "Somenzz", "job": "engineer"}Dengan bantuan Dict, anda boleh mentakrifkan jenis seperti ini:
from typing import Dict my_dict_type = Dict[str, str] my_dict: my_dict_type = {"name": "Somenzz", "job": "engineer"}6 Penggunaan TypedDict Bagaimana jika anda perlu menggesa untuk jenis sedemikian?
d = {"name": "Somenzz", "interests": ["chess", "tennis"]}Dengan bantuan TypedDict, anda boleh melakukan ini: TypedDict7. Penggunaan kesatuanSetakat Python 3.10, Union digantikan dengan | Ini bermakna Union[X, Y] kini bersamaan dengan X|Y. Kesatuan[X, Y] (atau X | Y) bermaksud X atau Y. Andaikan fungsi anda perlu membaca fail daripada direktori cache dan memuatkan model Obor. Lokasi direktori cache ini boleh menjadi nilai rentetan (seperti /home/cache), atau ia boleh menjadi objek Path daripada pustaka Pathlib, yang mana kodnya adalah seperti berikut:
def load_model(filename: str, cache_folder: Union[str, Path]): if isinstance(cache_folder, Path): cache_folder = str(cache_folder) model_path = os.join(filename, cache_folder) model = torch.load(model_path) return model8. Penggunaan boleh panggil Apabila anda perlu meneruskan fungsi sebagai parameter, pembayang jenis parameter ini boleh dipanggil.
from typing import Callable def sum_numbers(x: int, y: int) -> int: return x + y def foo(x: int, y: int, func: Callable) -> int: output = func(x, y) return output foo(1, 2, sum_numbers)Anda juga boleh menentukan senarai parameter untuk parameter fungsi tersebut, yang benar-benar berkuasa: Sintaks:
Callable[[input_type_1, ...], return_type]Contoh:
def foo(x: int, y: int, func: Callable[[int, int], int]) -> int: output = func(x, y) return output
当你传入的参数可以为任何类型的时候,就可以使用 Any
def bar(input: Any): ...
如果你的函数使用可选参数,具有默认值,那么你可以使用类型模块中的 Optional 类型。
from typing import Optional def foo(format_layout: Optional[bool] = True): ...
Sequence 类型的对象是可以被索引的任何东西:列表、元组、字符串、对象列表、元组列表的元组等。
from typing import Sequence def print_sequence_elements(sequence: Sequence[str]): for i, s in enumerate(s): print(f"item {i}: {s}"
Tuple 类型的工作方式与 List 类型略有不同,Tuple 需要指定每一个位置的类型:
from typing import Tuple t: Tuple[int, int, int] = (1, 2, 3)
如果你不关心元组中每个元素的类型,你可以继续使用内置类型 tuple。
t: tuple = (1, 2, 3, ["cat", "dog"], {"name": "John"})
类型提示在代码之上带来了额外的抽象层:它们有助于记录代码,澄清关于输入/输出的假设,并防止在顶部执行静态代码分析 (mypy) 时出现的隐蔽和错误。
Atas ialah kandungan terperinci Amalan terbaik untuk petunjuk jenis dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!