Liên kết loại Python

Đâ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
        first_name, last_name
    
    2 và
        first_name, last_name
    
    3
  • Chuyển đổi chữ cái đầu tiên của mỗi thành chữ hoa với
        first_name, last_name
    
    4
  • 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ành

Như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ấy

Cù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
0

Bở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
3

khai 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
17

Bạn có thể sử dụng, ví dụ

  • John Doe
    
    18
  • John Doe
    
    19
  • John Doe
    
    50
  • John Doe
    
    51

    first_name, last_name
9

Cá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ày

Cá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ại

Nế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
17

Tră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
0

Khai 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
56

Vì 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
1

Khai 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
53

Vì 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
2

Thô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
02

Tuy 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
54s

Trăn 3. 6 trở lên Python 3. 9 trở lên

John Doe
3

John Doe
4

Điều này có nghĩa là

  • Biến
        first_name, last_name
    
    33 là một
    John Doe
    
    55 với 3 mục, một
    John Doe
    
    18, một
    John Doe
    
    18 khác và một
    John Doe
    
    17
  • Biến
        first_name, last_name
    
    38 là một
    John Doe
    
    54 và mỗi mục của nó thuộc loại
    John Doe
    
    51

đọ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ẩy

Tham số loại đầu tiên dành cho các khóa của

John Doe
52

Tham số loại thứ hai dành cho các giá trị của

John Doe
52

Trăn 3. 6 trở lên Python 3. 9 trở lên

John Doe
5

John Doe
6

Điều này có nghĩa là

  • Biến
        first_name, last_name
    
    94 là một
    John Doe
    
    52
    • Các khóa của
      John Doe
      
      52 này thuộc loại
      John Doe
      
      17 [giả sử tên của từng mục]
    • Các giá trị của
      John Doe
      
      52 này thuộc loại
      John Doe
      
      19 [giả sử giá của từng mặt hàng]

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
17

Trong 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ận

Trong 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
7

John Doe
8

Trong 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
17

Có thể là
John Doe
08

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
08

Trong 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
56

John Doe
9

Sử 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
08

John 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
19

Trăn 3. 6 trở lên Python 3. 6 trở lên - thay thế Python 3. 10 trở lên

John Doe
9

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"]]
1

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"]]
2

Sử dụng
John Doe
02 hoặc
John Doe
11

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
    John Doe
    
    22
  • Thay vào đó ✨ hãy sử dụng
    John Doe
    
    23 ✨

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"]]
3

Tham 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"]]
4

Tham 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
08

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"]]
5

Tin 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ợp

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"]]
6

Và 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

  • John Doe
    
    62
  • John Doe
    
    37
  • John Doe
    
    38
  • John Doe
    
    39
  • John Doe
    
    02
  • John Doe
    
    11
  • 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]

  • John Doe
    
    53
  • John Doe
    
    55
  • John Doe
    
    54
  • John Doe
    
    52

Và giống như với Python 3. 6, từ mô-đun

John Doe
56

  • John Doe
    
    02
  • John Doe
    
    11
  • 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]

  • John Doe
    
    53
  • John Doe
    
    55
  • John Doe
    
    54
  • John Doe
    
    52

Và giống như với Python 3. 6, từ mô-đun

John Doe
56

  • John Doe
    
    02
  • John Doe
    
    11 [giống như với Python 3. 6]
  • 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ợp

Cá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ê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"]]
7

Sau đó, bạn có thể khai báo một biến có kiểu

John Doe
59

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"]]
8

Và 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
1

Thô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

Loại liên kết trong Python là gì?

Liên minh. Bạn có thể khai báo rằng một biến có thể thuộc bất kỳ loại nào, ví dụ: int hoặc str . Trong Trăn 3. 6 trở lên [bao gồm cả Python 3. 10] bạn có thể sử dụng loại Liên kết từ nhập và đặt bên trong dấu ngoặc vuông các loại có thể chấp nhận.

Kiểu [] trong Python là gì?

Hàm type[] được dùng để lấy loại đối tượng . Cú pháp hàm kiểu Python [] là. type[object] type[name, base, dict] Khi một đối số duy nhất được truyền cho hàm type[], nó sẽ trả về kiểu của đối tượng. Giá trị của nó giống như đối tượng.

Bí danh loại Python là gì?

Bí danh loại cho phép bạn cung cấp tên mới cho loại dữ liệu hiện có vào chương trình của mình . Sau khi một bí danh kiểu được khai báo, tên bí danh có thể được sử dụng thay cho kiểu hiện có trong suốt chương trình. Nhập bí danh không tạo loại mới.

Bạn có thể chỉ định loại trong Python không?

Chỉ định Loại biến . Điều này có thể được thực hiện bằng cách truyền . Python là một ngôn ngữ hướng đối tượng và do đó, nó sử dụng các lớp để xác định các kiểu dữ liệu, bao gồm cả các kiểu nguyên thủy của nó.

Chủ Đề