Đây chỉ là một hướng dẫn/bồi dưỡng nhanh về các gợi ý kiểu Python. Nó chỉ bao gồm mức tối thiểu cần thiết để sử dụng chúng với FastAPI. mà thực sự là rất ít
FastAPI đều dựa trên các gợi ý loại này, chúng mang lại cho nó nhiều ưu điểm và lợi ích
Nhưng ngay cả khi bạn chưa bao giờ sử dụng FastAPI, bạn sẽ có lợi khi tìm hiểu một chút về chúng
Ghi chú
Nếu bạn là một chuyên gia Python và bạn đã biết mọi thứ về gợi ý kiểu, hãy chuyển sang chương tiếp theo
Động lực
Hãy bắt đầu với một ví dụ đơn giản
def get_full_name[first_name, last_name]:
full_name = first_name.title[] + " " + last_name.title[]
return full_name
print[get_full_name["john", "doe"]]
Gọi chương trình này xuất ra
John Doe
Hàm thực hiện như sau
- Mất một
2 vàfirst_name, last_name
3first_name, last_name
- Chuyển đổi chữ cái đầu tiên của mỗi thành chữ hoa với
4first_name, last_name
- Nối chúng với một khoảng trống ở giữa
def get_full_name[first_name, last_name]:
full_name = first_name.title[] + " " + last_name.title[]
return full_name
print[get_full_name["john", "doe"]]
Sửa nó
Đó là một chương trình rất đơn giản
Nhưng bây giờ hãy tưởng tượng rằng bạn đang viết nó từ đầu
Tại một thời điểm nào đó, bạn sẽ bắt đầu định nghĩa hàm, bạn đã có sẵn các tham số
Nhưng sau đó bạn phải gọi "phương thức chuyển đổi chữ cái đầu tiên thành chữ hoa"
Có phải là
first_name, last_name
5 không? Sau đó, bạn thử với bạn của lập trình viên cũ, tự động hoàn thành trình chỉnh sửa
Bạn gõ tham số đầu tiên của hàm là
first_name, last_name
2 sau đó là dấu chấm [John Doe
10] rồi nhấn John Doe
11 để kích hoạt hoàn thànhNhưng, thật đáng buồn, bạn không nhận được gì hữu ích
thêm loại
Hãy sửa đổi một dòng từ phiên bản trước
Chúng tôi sẽ thay đổi chính xác đoạn này, các tham số của hàm, từ
first_name, last_name
đến
John Doe
1Đó là nó
Đó là những "gợi ý loại"
John Doe
5Điều đó không giống với việc khai báo các giá trị mặc định như với
John Doe
6Đó là một điều khác biệt
Chúng tôi đang sử dụng dấu hai chấm [
John Doe
12], không bằng [John Doe
13]Và việc thêm gợi ý loại thường không thay đổi những gì xảy ra so với những gì sẽ xảy ra nếu không có chúng
Nhưng bây giờ, hãy tưởng tượng bạn đang ở giữa quá trình tạo hàm đó, nhưng với các gợi ý kiểu
Đồng thời, bạn thử kích hoạt tính năng tự động hoàn thành với
John Doe
11 và bạn sẽ thấyCùng với đó, bạn có thể cuộn, xem các tùy chọn, cho đến khi bạn tìm thấy tùy chọn "rung chuông"
Thêm động lực
Kiểm tra chức năng này, nó đã có gợi ý loại
first_name, last_name
0Bởi vì trình chỉnh sửa biết các loại biến, bạn không chỉ hoàn thành mà còn được kiểm tra lỗi
Bây giờ bạn biết rằng bạn phải sửa nó, chuyển đổi
John Doe
15 thành một chuỗi có John Doe
16 first_name, last_name
3khai báo các loại
Bạn vừa xem nơi chính để khai báo kiểu gợi ý. Là tham số chức năng
Đây cũng là nơi chính bạn sẽ sử dụng chúng với FastAPI
các loại đơn giản
Bạn có thể khai báo tất cả các loại Python tiêu chuẩn, không chỉ
John Doe
17Bạn có thể sử dụng, ví dụ
18John Doe
19John Doe
50John Doe
51John Doe
first_name, last_name
9Các loại chung với các tham số loại
Có một số cấu trúc dữ liệu có thể chứa các giá trị khác, như ________ 152, ________ 153, ________ 154 và ________ 155. Và các giá trị bên trong cũng có thể có loại riêng
Những loại có loại bên trong được gọi là loại "chung". Và có thể khai báo chúng, ngay cả với các loại bên trong của chúng
Để khai báo các loại đó và các loại bên trong, bạn có thể sử dụng mô-đun Python tiêu chuẩn
John Doe
56. Nó tồn tại đặc biệt để hỗ trợ các gợi ý loại nàyCác phiên bản mới hơn của Python
Cú pháp sử dụng
John Doe
56 tương thích với mọi phiên bản, từ Python 3. 6 đến những cái mới nhất, bao gồm cả Python 3. 9, Trăn 3. 10, v.v.Khi Python phát triển, các phiên bản mới hơn đi kèm với hỗ trợ cải tiến cho các chú thích loại này và trong nhiều trường hợp, bạn thậm chí không cần nhập và sử dụng mô-đun
John Doe
56 để khai báo các chú thích loạiNếu bạn có thể chọn phiên bản Python mới hơn cho dự án của mình, bạn sẽ có thể tận dụng sự đơn giản hơn đó. Xem một số ví dụ dưới đây
Danh sách
Ví dụ: hãy xác định một biến là một
John Doe
53 của John Doe
17Trăn 3. 6 trở lên Python 3. 9 trở lên
Từ
John Doe
56, nhập khẩu John Doe
62 [vốn John Doe
63]John Doe
0Khai báo biến, với cùng cú pháp dấu hai chấm [
John Doe
12]Là loại, đặt
John Doe
62 mà bạn đã nhập từ John Doe
56Vì danh sách là kiểu chứa một số kiểu bên trong nên bạn đặt chúng trong ngoặc vuông
John Doe
1Khai báo biến, với cùng cú pháp dấu hai chấm [
John Doe
12]Là loại, đặt
John Doe
53Vì danh sách là kiểu chứa một số kiểu bên trong nên bạn đặt chúng trong ngoặc vuông
John Doe
2Thông tin
Các loại bên trong trong ngoặc vuông được gọi là "tham số loại"
Trong trường hợp này,
John Doe
17 là tham số kiểu được truyền cho John Doe
62 [hoặc John Doe
53 trong Python 3. 9 trở lên]Điều đó có nghĩa là. "biến
first_name, last_name
02 là một John Doe
53 và mỗi mục trong danh sách này là một John Doe
17"Mẹo
Nếu bạn sử dụng Python 3. 9 trở lên, bạn không phải nhập
John Doe
62 từ John Doe
56, bạn có thể sử dụng cùng loại John Doe
53 thông thường để thay thếBằng cách đó, trình soạn thảo của bạn có thể cung cấp hỗ trợ ngay cả khi đang xử lý các mục từ danh sách
Không có loại, điều đó gần như không thể đạt được
Lưu ý rằng biến
first_name, last_name
08 là một trong những phần tử trong danh sách first_name, last_name
02Tuy nhiên, biên tập viên biết đó là một
John Doe
17 và cung cấp hỗ trợ cho điều đóTuple và Set
Bạn sẽ làm tương tự để khai báo
John Doe
55s và John Doe
54sTrăn 3. 6 trở lên Python 3. 9 trở lên
John Doe
3John Doe
4Điều này có nghĩa là
- Biến
33 là mộtfirst_name, last_name
55 với 3 mục, mộtJohn Doe
18, mộtJohn Doe
18 khác và mộtJohn Doe
17John Doe
- Biến
38 là mộtfirst_name, last_name
54 và mỗi mục của nó thuộc loạiJohn Doe
51John Doe
đọc chính tả
Để xác định một
John Doe
52, bạn truyền 2 tham số loại, cách nhau bởi dấu phẩyTham số loại đầu tiên dành cho các khóa của
John Doe
52Tham số loại thứ hai dành cho các giá trị của
John Doe
52Trăn 3. 6 trở lên Python 3. 9 trở lên
John Doe
5John Doe
6Điều này có nghĩa là
- Biến
94 là mộtfirst_name, last_name
52John Doe
- Các khóa của
52 này thuộc loạiJohn Doe
17 [giả sử tên của từng mục]John Doe
- Các giá trị của
52 này thuộc loạiJohn Doe
19 [giả sử giá của từng mặt hàng]John Doe
- Các khóa của
liên hiệp
Bạn có thể khai báo rằng một biến có thể là bất kỳ loại nào trong số nhiều loại, ví dụ:
John Doe
18 hoặc John Doe
17Trong Trăn 3. 6 trở lên [bao gồm cả Python 3. 10] bạn có thể sử dụng loại
John Doe
02 từ John Doe
56 và đặt bên trong dấu ngoặc vuông những loại có thể chấp nhậnTrong Trăn 3. 10 cũng có một cú pháp thay thế trong đó bạn có thể đặt các loại có thể được phân tách bằng một thanh dọc [
John Doe
04]Trăn 3. 6 trở lên Python 3. 10 trở lên
John Doe
7John Doe
8Trong cả hai trường hợp, điều này có nghĩa là
first_name, last_name
08 có thể là một John Doe
18 hoặc một John Doe
17Có thể là John Doe
08
John Doe
Bạn có thể khai báo rằng một giá trị có thể có một loại, chẳng hạn như
John Doe
17, nhưng nó cũng có thể là John Doe
08Trong Trăn 3. 6 trở lên [bao gồm cả Python 3. 10] bạn có thể khai báo bằng cách nhập và sử dụng
John Doe
11 từ mô-đun John Doe
56John Doe
9Sử dụng
John Doe
13 thay vì chỉ John Doe
17 sẽ cho phép trình chỉnh sửa giúp bạn phát hiện các lỗi mà bạn có thể cho rằng giá trị luôn là John Doe
17, trong khi thực tế nó cũng có thể là John Doe
08John Doe
17 thực ra là viết tắt của John Doe
18, chúng tương đương nhauĐiều này cũng có nghĩa là trong Python 3. 10, bạn có thể sử dụng
John Doe
19Trăn 3. 6 trở lên Python 3. 6 trở lên - thay thế Python 3. 10 trở lên
John Doe
9def get_full_name[first_name, last_name]:
full_name = first_name.title[] + " " + last_name.title[]
return full_name
print[get_full_name["john", "doe"]]
1def get_full_name[first_name, last_name]:
full_name = first_name.title[] + " " + last_name.title[]
return full_name
print[get_full_name["john", "doe"]]
2Sử dụng John Doe
02 hoặc John Doe
11
John Doe
John Doe
Nếu bạn đang sử dụng phiên bản Python dưới 3. 10, đây là mẹo từ quan điểm rất chủ quan của tôi
- 🚨 Tránh sử dụng
22John Doe
- Thay vào đó ✨ hãy sử dụng
23 ✨John Doe
Cả hai đều tương đương và bên dưới chúng giống nhau, nhưng tôi khuyên dùng
John Doe
02 thay vì John Doe
11 vì từ "tùy chọn" dường như ngụ ý rằng giá trị là tùy chọn và nó thực sự có nghĩa là "có thể là John Doe
08", ngay cả khi nó không phải là tùy chọn Tôi nghĩ rằng
John Doe
23 rõ ràng hơn về ý nghĩa của nóNó chỉ là về các từ và tên. Nhưng những từ đó có thể ảnh hưởng đến cách bạn và đồng đội nghĩ về mã
Ví dụ, hãy lấy chức năng này
def get_full_name[first_name, last_name]:
full_name = first_name.title[] + " " + last_name.title[]
return full_name
print[get_full_name["john", "doe"]]
3Tham số
John Doe
28 được định nghĩa là John Doe
13, nhưng nó không bắt buộc, bạn không thể gọi hàm mà không có tham sốdef get_full_name[first_name, last_name]:
full_name = first_name.title[] + " " + last_name.title[]
return full_name
print[get_full_name["john", "doe"]]
4Tham số
John Doe
28 vẫn bắt buộc [không phải tùy chọn] vì nó không có giá trị mặc định. Tuy nhiên, John Doe
28 chấp nhận giá trị của John Doe
08def get_full_name[first_name, last_name]:
full_name = first_name.title[] + " " + last_name.title[]
return full_name
print[get_full_name["john", "doe"]]
5Tin tốt là, khi bạn đang sử dụng Python 3. 10 bạn sẽ không phải lo lắng về điều đó, vì bạn sẽ có thể chỉ cần sử dụng
John Doe
04 để xác định các loại kết hợpdef get_full_name[first_name, last_name]:
full_name = first_name.title[] + " " + last_name.title[]
return full_name
print[get_full_name["john", "doe"]]
6Và sau đó bạn sẽ không phải lo lắng về những cái tên như
John Doe
11 và John Doe
02. 😎loại chung
Những kiểu lấy tham số kiểu trong ngoặc vuông gọi là kiểu Generic hay Generics chẳng hạn
Trăn 3. 6 trở lên Python 3. 9 trở lên Python 3. 10 trở lên
62John Doe
37John Doe
38John Doe
39John Doe
02John Doe
11John Doe
- và những người khác
Bạn có thể sử dụng các loại dựng sẵn giống như thuốc generic [có dấu ngoặc vuông và loại bên trong]
53John Doe
55John Doe
54John Doe
52John Doe
Và giống như với Python 3. 6, từ mô-đun
John Doe
56
02John Doe
11John Doe
- và những người khác
Bạn có thể sử dụng các loại dựng sẵn giống như thuốc generic [có dấu ngoặc vuông và loại bên trong]
53John Doe
55John Doe
54John Doe
52John Doe
Và giống như với Python 3. 6, từ mô-đun
John Doe
56
02John Doe
11 [giống như với Python 3. 6]John Doe
- và những người khác
Trong Trăn 3. 10, như một cách thay thế cho việc sử dụng tên chung
John Doe
02 và John Doe
11, bạn có thể sử dụng thanh dọc [John Doe
04] để khai báo các loại kết hợpCác lớp như các loại
Bạn cũng có thể khai báo một lớp là kiểu của một biến
Giả sử bạn có một lớp
John Doe
59, với têndef get_full_name[first_name, last_name]:
full_name = first_name.title[] + " " + last_name.title[]
return full_name
print[get_full_name["john", "doe"]]
7Sau đó, bạn có thể khai báo một biến có kiểu
John Doe
59def get_full_name[first_name, last_name]:
full_name = first_name.title[] + " " + last_name.title[]
return full_name
print[get_full_name["john", "doe"]]
8Và sau đó, một lần nữa, bạn nhận được tất cả sự hỗ trợ của biên tập viên
mô hình pydantic
Pydantic là một thư viện Python để thực hiện xác thực dữ liệu
Bạn khai báo "hình dạng" của dữ liệu dưới dạng các lớp có thuộc tính
Và mỗi thuộc tính có một loại
Sau đó, bạn tạo một thể hiện của lớp đó với một số giá trị và nó sẽ xác thực các giá trị đó, chuyển đổi chúng thành loại thích hợp [nếu đúng như vậy] và cung cấp cho bạn một đối tượng có tất cả dữ liệu
Và bạn nhận được tất cả sự hỗ trợ của trình chỉnh sửa với đối tượng kết quả đó
Một ví dụ từ các tài liệu chính thức của Pydantic
Trăn 3. 6 trở lên Python 3. 9 trở lên Python 3. 10 trở lên
def get_full_name[first_name, last_name]:
full_name = first_name.title[] + " " + last_name.title[]
return full_name
print[get_full_name["john", "doe"]]
9 first_name, last_name
0 first_name, last_name
1Thông tin
Để tìm hiểu thêm về Pydantic, hãy xem tài liệu của nó
FastAPI hoàn toàn dựa trên Pydantic
Bạn sẽ thấy nhiều hơn nữa về tất cả những điều này trong thực tế trong Hướng dẫn - Hướng dẫn sử dụng
Mẹo
Pydantic có hành vi đặc biệt khi bạn sử dụng
John Doe
11 hoặc John Doe
18 mà không có giá trị mặc định, bạn có thể đọc thêm về điều này trong tài liệu Pydantic vềNhập gợi ý trong FastAPI
FastAPI tận dụng các gợi ý loại này để thực hiện một số việc
Với FastAPI, bạn khai báo các tham số với gợi ý kiểu và bạn nhận được
- hỗ trợ biên tập viên
- Loại kiểm tra
và FastAPI sử dụng cùng một khai báo để
- Xác định yêu cầu. từ tham số đường dẫn yêu cầu, tham số truy vấn, tiêu đề, nội dung, phụ thuộc, v.v.
- Chuyển đổi dữ liệu. từ yêu cầu đến loại yêu cầu
- Xác thực dữ liệu. đến từ mỗi yêu cầu
- Tạo lỗi tự động trả về client khi dữ liệu không hợp lệ
- Ghi lại API bằng OpenAPI
- mà sau đó được sử dụng bởi giao diện người dùng tài liệu tương tác tự động
Tất cả điều này nghe có vẻ trừu tượng. Đừng lo. Bạn sẽ thấy tất cả điều này đang hoạt động trong Hướng dẫn - Hướng dẫn sử dụng
Điều quan trọng là bằng cách sử dụng các loại Python tiêu chuẩn, ở một nơi duy nhất [thay vì thêm nhiều lớp, trình trang trí, v.v.], FastAPI sẽ thực hiện rất nhiều công việc cho bạn
Thông tin
Nếu bạn đã xem qua tất cả các hướng dẫn và quay lại để xem thêm về các loại, thì một nguồn tốt là "cheat sheet" từ
John Doe
63