Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Amalan terbaik untuk petunjuk jenis dalam Python

Amalan terbaik untuk petunjuk jenis dalam Python

王林
王林ke hadapan
2023-04-23 09:28:061481semak imbas

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.

1. Pembayang jenis hanya sah pada tahap sintaksis

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

2. Gunakan mypy untuk menyemak petunjuk jenis

Jika terdapat sekeping kod:

x: int = 2

x = 3.5

Tidak akan ada ralat semasa melaksanakan dengan penterjemah Python:

如何更好的使用 Python 的类型提示?

Dengan bantuan mypy, mula-mula pasang dengan pip install mypy, dan kemudian skrip mypy.py Itu sahaja:

如何更好的使用 Python 的类型提示?

Untuk lebih banyak maklumat berkaitan mypy, sila rujuk artikel sebelumnya mypy Alat ini menjadikan pembayang jenis Python sangat praktikal.

3. Faedah pembayang jenis

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.

如何更好的使用 Python 的类型提示?

Semakan jenis IDE

如何更好的使用 Python 的类型提示?

Semakan jenis IDE

如何更好的使用 Python 的类型提示?

Pelengkapan automatik selepas semakan jenis IDE

4 Penggunaan senarai

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)

5 Penggunaan dict

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:

如何更好的使用 Python 的类型提示?

TypedDict

7. Penggunaan kesatuan

Setakat 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 model

8. 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

9、Any 用法

当你传入的参数可以为任何类型的时候,就可以使用 Any

def bar(input: Any):
...

10、Optional 用法

如果你的函数使用可选参数,具有默认值,那么你可以使用类型模块中的 Optional 类型。

from typing import Optional

def foo(format_layout: Optional[bool] = True):
...

11、Sequence 用法

Sequence 类型的对象是可以被索引的任何东西:列表、元组、字符串、对象列表、元组列表的元组等。

from typing import Sequence

def print_sequence_elements(sequence: Sequence[str]):
for i, s in enumerate(s):
print(f"item {i}: {s}"

12、Tuple 用法

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!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam