From: Nguyễn Khắc Thành Date: Thu, 10 Aug 2023 15:52:25 +0000 (+0700) Subject: 🌐 Add Vietnamese translation for `docs/vi/docs/python-types.md` (#10047) X-Git-Tag: 0.101.1~17 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f0ab797de47d7eb4c80394339039ffaf4a734fae;p=thirdparty%2Ffastapi%2Ffastapi.git 🌐 Add Vietnamese translation for `docs/vi/docs/python-types.md` (#10047) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index a186131858..a66b6c1479 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -241,7 +241,7 @@ extra: - link: /uk/ name: uk - link: /vi/ - name: vi + name: vi - Tiếng Việt - link: /zh/ name: zh - 汉语 extra_css: diff --git a/docs/vi/docs/python-types.md b/docs/vi/docs/python-types.md new file mode 100644 index 0000000000..7f4f51131f --- /dev/null +++ b/docs/vi/docs/python-types.md @@ -0,0 +1,545 @@ +# Giới thiệu kiểu dữ liệu Python + +Python hỗ trợ tùy chọn "type hints" (còn được gọi là "type annotations"). + +Những **"type hints"** hay chú thích là một cú pháp đặc biệt cho phép khai báo kiểu dữ liệu cá»§a một biến. + +Bằng việc khai báo kiểu dữ liệu cho các biến cá»§a bạn, các trình soạn thảo và các công cụ có thể hỗ trợ bạn tốt hÆ¡n. + +Đây chỉ là một **hướng dẫn nhanh** về gợi ý kiểu dữ liệu trong Python. Nó chỉ bao gồm những điều cần thiết tối thiểu để sá»­ dụng chúng với **FastAPI**... đó thá»±c sá»± là rất ít. + +**FastAPI** hoàn toàn được dá»±a trên những gợi ý kiểu dữ liệu, chúng mang đến nhiều ưu điểm và lợi ích. + +Nhưng thậm chí nếu bạn không bao giờ sá»­ dụng **FastAPI**, bạn sẽ được lợi từ việc học một ít về chúng. + +!!! note + Nếu bạn là một chuyên gia về Python, và bạn đã biết mọi thứ về gợi ý kiểu dữ liệu, bỏ qua và đi tới chương tiếp theo. + +## Động lá»±c + +Hãy bắt đầu với một ví dụ đơn giản: + +```Python +{!../../../docs_src/python_types/tutorial001.py!} +``` + +Kết quả khi gọi chương trình này: + +``` +John Doe +``` + +Hàm thá»±c hiện như sau: + +* Lấy một `first_name` và `last_name`. +* Chuyển đổi kí tá»± đầu tiên cá»§a mỗi biến sang kiểu chữ hoa với `title()`. +* Nối chúng lại với nhau bằng một kí tá»± trắng ở giữa. + +```Python hl_lines="2" +{!../../../docs_src/python_types/tutorial001.py!} +``` + +### Sá»­a đổi + +Nó là một chương trình rất đơn giản. + +Nhưng bây giờ hình dung rằng bạn đang viết nó từ đầu. + +Tại một vài thời điểm, bạn sẽ bắt đầu định nghÄ©a hàm, bạn có các tham số... + +Nhưng sau đó bạn phải gọi "phương thức chuyển đổi kí tá»± đầu tiên sang kiểu chữ hoa". + +Có phải là `upper`? Có phải là `uppercase`? `first_uppercase`? `capitalize`? + +Sau đó, bạn thá»­ hỏi người bạn cÅ© cá»§a mình, autocompletion cá»§a trình soạn thảo. + +Bạn gõ tham số đầu tiên cá»§a hàm, `first_name`, sau đó một dấu chấm (`.`) và sau đó ấn `Ctrl+Space` để kích hoạt bộ hoàn thành. + +Nhưng đáng buồn, bạn không nhận được điều gì hữu ích cả: + + + +### Thêm kiểu dữ liệu + +Hãy sá»­a một dòng từ phiên bản trước. + +Chúng ta sẽ thay đổi chính xác đoạn này, tham số cá»§a hàm, từ: + +```Python + first_name, last_name +``` + +sang: + +```Python + first_name: str, last_name: str +``` + +Chính là nó. + +Những thứ đó là "type hints": + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial002.py!} +``` + +Đó không giống như khai báo những giá trị mặc định giống như: + +```Python + first_name="john", last_name="doe" +``` + +Nó là một thứ khác. + +Chúng ta sá»­ dụng dấu hai chấm (`:`), không phải dấu bằng (`=`). + +Và việc thêm gợi ý kiểu dữ liệu không làm thay đổi những gì xảy ra so với khi chưa thêm chúng. + +But now, imagine you are again in the middle of creating that function, but with type hints. + +Tại cùng một điểm, bạn thá»­ kích hoạt autocomplete với `Ctrl+Space` và bạn thấy: + + + +Với cái đó, bạn có thể cuộn, nhìn thấy các lá»±a chọn, cho đến khi bạn tìm thấy một "tiếng chuông": + + + +## Động lá»±c nhiều hÆ¡n + +Kiểm tra hàm này, nó đã có gợi ý kiểu dữ liệu: + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial003.py!} +``` + +Bởi vì trình soạn thảo biết kiểu dữ liệu cá»§a các biến, bạn không chỉ có được completion, bạn cÅ©ng được kiểm tra lỗi: + + + +Bây giờ bạn biết rằng bạn phải sá»­a nó, chuyển `age` sang một xâu với `str(age)`: + +```Python hl_lines="2" +{!../../../docs_src/python_types/tutorial004.py!} +``` + +## Khai báo các kiểu dữ liệu + +Bạn mới chỉ nhìn thấy những nÆ¡i chá»§ yếu để đặt khai báo kiểu dữ liệu. Như là các tham số cá»§a hàm. + +Đây cÅ©ng là nÆ¡i chá»§ yếu để bạn sá»­ dụng chúng với **FastAPI**. + +### Kiểu dữ liệu đơn giản + +Bạn có thể khai báo tất cả các kiểu dữ liệu chuẩn cá»§a Python, không chỉ là `str`. + +Bạn có thể sá»­ dụng, ví dụ: + +* `int` +* `float` +* `bool` +* `bytes` + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial005.py!} +``` + +### Các kiểu dữ liệu tổng quát với tham số kiểu dữ liệu + +Có một vài cấu trúc dữ liệu có thể chứa các giá trị khác nhau như `dict`, `list`, `set` và `tuple`. Và những giá trị nội tại cÅ©ng có thể có kiểu dữ liệu cá»§a chúng. + +Những kiểu dữ liệu nội bộ này được gọi là những kiểu dữ liệu "**tổng quát**". Và có khả năng khai báo chúng, thậm chí với các kiểu dữ liệu nội bộ cá»§a chúng. + +Để khai báo những kiểu dữ liệu và những kiểu dữ liệu nội bộ đó, bạn có thể sá»­ dụng mô đun chuẩn cá»§a Python là `typing`. Nó có hỗ trợ những gợi ý kiểu dữ liệu này. + +#### Những phiên bản mới hÆ¡n cá»§a Python + +Cú pháp sá»­ dụng `typing` **tương thích** với tất cả các phiên bản, từ Python 3.6 tới những phiên bản cuối cùng, bao gồm Python 3.9, Python 3.10,... + +As Python advances, **những phiên bản mới** mang tới sá»± hỗ trợ được cải tiến cho những chú thích kiểu dữ liệu và trong nhiều trường hợp bạn thậm chí sẽ không cần import và sá»­ dụng mô đun `typing` để khai báo chú thích kiểu dữ liệu. + +Nếu bạn có thể chọn một phiên bản Python gần đây hÆ¡n cho dá»± án cá»§a bạn, ban sẽ có được những ưu điểm cá»§a những cải tiến đơn giản đó. + +Trong tất cả các tài liệu tồn tại những ví dụ tương thích với mỗi phiên bản Python (khi có một sá»± khác nhau). + +Cho ví dụ "**Python 3.6+**" có nghÄ©a là nó tương thích với Python 3.7 hoặc lớn hÆ¡n (bao gồm 3.7, 3.8, 3.9, 3.10,...). và "**Python 3.9+**" nghÄ©a là nó tương thích với Python 3.9 trở lên (bao gồm 3.10,...). + +Nếu bạn có thể sá»­ dụng **phiên bản cuối cùng cá»§a Python**, sá»­ dụng những ví dụ cho phiên bản cuối, những cái đó sẽ có **cú pháp đơn giản và tốt nhât**, ví dụ, "**Python 3.10+**". + +#### List + +Ví dụ, hãy định nghÄ©a một biến là `list` các `str`. + +=== "Python 3.9+" + + Khai báo biến với cùng dấu hai chấm (`:`). + + Tương tá»± kiểu dữ liệu `list`. + + Như danh sách là một kiểu dữ liệu chứa một vài kiểu dữ liệu có sẵn, bạn đặt chúng trong các dấu ngoặc vuông: + + ```Python hl_lines="1" + {!> ../../../docs_src/python_types/tutorial006_py39.py!} + ``` + +=== "Python 3.6+" + + Từ `typing`, import `List` (với chữ cái `L` viết hoa): + + ``` Python hl_lines="1" + {!> ../../../docs_src/python_types/tutorial006.py!} + ``` + + Khai báo biến với cùng dấu hai chấm (`:`). + + Tương tá»± như kiểu dữ liệu, `List` bạn import từ `typing`. + + Như danh sách là một kiểu dữ liệu chứa các kiểu dữ liệu có sẵn, bạn đặt chúng bên trong dấu ngoặc vuông: + + ```Python hl_lines="4" + {!> ../../../docs_src/python_types/tutorial006.py!} + ``` + +!!! info + Các kiểu dữ liệu có sẵn bên trong dấu ngoặc vuông được gọi là "tham số kiểu dữ liệu". + + Trong trường hợp này, `str` là tham số kiểu dữ liệu được truyền tới `List` (hoặc `list` trong Python 3.9 trở lên). + +Có nghÄ©a là: "biến `items` là một `list`, và mỗi phần tá»­ trong danh sách này là một `str`". + +!!! tip + Nếu bạn sá»­ dụng Python 3.9 hoặc lớn hÆ¡n, bạn không phải import `List` từ `typing`, bạn có thể sá»­ dụng `list` để thay thế. + +Bằng cách này, trình soạn thảo cá»§a bạn có thể hỗ trợ trong khi xá»­ lí các phần tá»­ trong danh sách: + + + +Đa phần đều không thể đạt được nếu không có các kiểu dữ liệu. + +Chú ý rằng, biến `item` là một trong các phần tá»­ trong danh sách `items`. + +Và do vậy, trình soạn thảo biết nó là một `str`, và cung cấp sá»± hỗ trợ cho nó. + +#### Tuple and Set + +Bạn sẽ làm điều tương tá»± để khai báo các `tuple` và các `set`: + +=== "Python 3.9+" + + ```Python hl_lines="1" + {!> ../../../docs_src/python_types/tutorial007_py39.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="1 4" + {!> ../../../docs_src/python_types/tutorial007.py!} + ``` + +Điều này có nghÄ©a là: + +* Biến `items_t` là một `tuple` với 3 phần tá»­, một `int`, một `int` nữa, và một `str`. +* Biến `items_s` là một `set`, và mỗi phần tá»­ cá»§a nó có kiểu `bytes`. + +#### Dict + +Để định nghÄ©a một `dict`, bạn truyền 2 tham số kiểu dữ liệu, phân cách bởi dấu phẩy. + +Tham số kiểu dữ liệu đầu tiên dành cho khóa cá»§a `dict`. + +Tham số kiểu dữ liệu thứ hai dành cho giá trị cá»§a `dict`. + +=== "Python 3.9+" + + ```Python hl_lines="1" + {!> ../../../docs_src/python_types/tutorial008_py39.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="1 4" + {!> ../../../docs_src/python_types/tutorial008.py!} + ``` + +Điều này có nghÄ©a là: + +* Biến `prices` là một `dict`: + * Khóa cá»§a `dict` này là kiểu `str` (đó là tên cá»§a mỗi vật phẩm). + * Giá trị cá»§a `dict` này là kiểu `float` (đó là giá cá»§a mỗi vật phẩm). + +#### Union + +Bạn có thể khai báo rằng một biến có thể là **một vài kiểu dữ liệu" bất kì, ví dụ, một `int` hoặc một `str`. + +Trong Python 3.6 hoặc lớn hÆ¡n (bao gồm Python 3.10) bạn có thể sá»­ dụng kiểu `Union` từ `typing` và đặt trong dấu ngoặc vuông những giá trị được chấp nhận. + +In Python 3.10 there's also a **new syntax** where you can put the possible types separated by a vertical bar (`|`). + +Trong Python 3.10 cÅ©ng có một **cú pháp mới** mà bạn có thể đặt những kiểu giá trị khả thi phân cách bởi một dấu sổ dọc (`|`). + + +=== "Python 3.10+" + + ```Python hl_lines="1" + {!> ../../../docs_src/python_types/tutorial008b_py310.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="1 4" + {!> ../../../docs_src/python_types/tutorial008b.py!} + ``` + +Trong cả hai trường hợp có nghÄ©a là `item` có thể là một `int` hoặc `str`. + +#### Khả năng `None` + +Bạn có thể khai báo một giá trị có thể có một kiểu dữ liệu, giống như `str`, nhưng nó cÅ©ng có thể là `None`. + +Trong Python 3.6 hoặc lớn hÆ¡n (bao gồm Python 3.10) bạn có thể khai báo nó bằng các import và sá»­ dụng `Optional` từ mô đun `typing`. + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial009.py!} +``` + +Sá»­ dụng `Optional[str]` thay cho `str` sẽ cho phép trình soạn thảo giúp bạn phát hiện các lỗi mà bạn có thể gặp như một giá trị luôn là một `str`, trong khi thá»±c tế nó rất có thể là `None`. + +`Optional[Something]` là một cách viết ngắn gọn cá»§a `Union[Something, None]`, chúng là 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 `Something | None`: + +=== "Python 3.10+" + + ```Python hl_lines="1" + {!> ../../../docs_src/python_types/tutorial009_py310.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="1 4" + {!> ../../../docs_src/python_types/tutorial009.py!} + ``` + +=== "Python 3.6+ alternative" + + ```Python hl_lines="1 4" + {!> ../../../docs_src/python_types/tutorial009b.py!} + ``` + +#### Sá»­ dụng `Union` hay `Optional` + +If you are using a Python version below 3.10, here's a tip from my very **subjective** point of view: + +Nếu bạn đang sá»­ dụng phiên bản Python dưới 3.10, đây là một mẹo từ ý kiến rất "chá»§ quan" cá»§a tôi: + +* 🚨 Tránh sá»­ dụng `Optional[SomeType]` +* Thay vào đó ✨ **sá»­ dụng `Union[SomeType, None]`** ✨. + +Cả hai là tương đương và bên dưới chúng giống nhau, nhưng tôi sẽ đễ xuất `Union` thay cho `Optional` vì từ "**tùy chọn**" có vẻ ngầm định giá trị là tùy chọn, và nó thá»±c sá»± có nghÄ©a rằng "nó có thể là `None`", do đó nó không phải là tùy chọn và nó vẫn được yêu cầu. + +Tôi nghÄ© `Union[SomeType, None]` là 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 cách bạn và những đồng đội cá»§a bạn suy nghÄ© về code. + +Cho một ví dụ, hãy để ý hàm này: + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial009c.py!} +``` + +Tham số `name` được định nghÄ©a là `Optional[str]`, nhưng nó **không phải là tùy chọn**, bạn không thể gọi hàm mà không có tham số: + +```Python +say_hi() # Oh, no, this throws an error! 😱 +``` + +Tham số `name` **vẫn được yêu cầu** (không phải là *tùy chọn*) vì nó không có giá trị mặc định. Trong khi đó, `name` chấp nhận `None` như là giá trị: + +```Python +say_hi(name=None) # This works, None is valid 🎉 +``` + +Tin tốt là, khi bạn sá»­ dụng Python 3.10, bạn sẽ không phải lo lắng về điều đó, bạn sẽ có thể sá»­ dụng `|` để định nghÄ©a hợp cá»§a các kiểu dữ liệu một cách đơn giản: + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial009c_py310.py!} +``` + +Và sau đó, bạn sẽ không phải lo rằng những cái tên như `Optional` và `Union`. 😎 + + +#### Những kiểu dữ liệu tổng quát + +Những kiểu dữ liệu này lấy tham số kiểu dữ liệu trong dấu ngoặc vuông được gọi là **Kiểu dữ liệu tổng quát**, cho ví dụ: + +=== "Python 3.10+" + + Bạn có thể sá»­ dụng các kiểu dữ liệu có sẵn như là kiểu dữ liệu tổng quát (với ngoặc vuông và kiểu dữ liệu bên trong): + + * `list` + * `tuple` + * `set` + * `dict` + + Và tương tá»± với Python 3.6, từ mô đun `typing`: + + * `Union` + * `Optional` (tương tá»± như Python 3.6) + * ...và các kiểu dữ liệu khác. + + Trong Python 3.10, thay vì sá»­ dụng `Union` và `Optional`, bạn có thể sá»­ dụng sổ dọc ('|') để khai báo hợp cá»§a các kiểu dữ liệu, điều đó tốt hÆ¡n và đơn giản hÆ¡n nhiều. + +=== "Python 3.9+" + + Bạn có thể sá»­ dụng các kiểu dữ liệu có sẵn tương tá»± như (với ngoặc vuông và kiểu dữ liệu bên trong): + + * `list` + * `tuple` + * `set` + * `dict` + + Và tương tá»± với Python 3.6, từ mô đun `typing`: + + * `Union` + * `Optional` + * ...and others. + +=== "Python 3.6+" + + * `List` + * `Tuple` + * `Set` + * `Dict` + * `Union` + * `Optional` + * ...và các kiểu khác. + +### Lớp như kiểu dữ liệu + +Bạn cÅ©ng có thể khai báo một lớp như là kiểu dữ liệu cá»§a một biến. + +Hãy nói rằng bạn muốn có một lớp `Person` với một tên: + +```Python hl_lines="1-3" +{!../../../docs_src/python_types/tutorial010.py!} +``` + +Sau đó bạn có thể khai báo một biến có kiểu là `Person`: + +```Python hl_lines="6" +{!../../../docs_src/python_types/tutorial010.py!} +``` + +Và lại một lần nữa, bạn có được tất cả sá»± hỗ trợ từ trình soạn thảo: + + + +Lưu ý rằng, điều này có nghÄ©a rằng "`one_person`" là một **thá»±c thể** cá»§a lớp `Person`. + +Nó không có nghÄ©a "`one_person`" là một **lớp** gọi là `Person`. + +## Pydantic models + +Pydantic là một thư viện Python để validate dữ liệu hiệu năng cao. + +Bạn có thể khai báo "hình dạng" cá»§a dữa liệu như là các lớp với các thuộc tính. + +Và mỗi thuộc tính có một kiểu dữ liệu. + +Sau đó bạn tạo một thá»±c thể cá»§a lớp đó với một vài giá trị và nó sẽ validate các giá trị, chuyển đổi chúng sang kiểu dữ liệu phù hợp (nếu đó là trường hợp) và cho bạn một object với toàn bộ dữ liệu. + +Và bạn nhận được tất cả sá»± hỗ trợ cá»§a trình soạn thảo với object kết quả đó. + +Một ví dụ từ tài liệu chính thức cá»§a Pydantic: + +=== "Python 3.10+" + + ```Python + {!> ../../../docs_src/python_types/tutorial011_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python + {!> ../../../docs_src/python_types/tutorial011_py39.py!} + ``` + +=== "Python 3.6+" + + ```Python + {!> ../../../docs_src/python_types/tutorial011.py!} + ``` + +!!! info + Để học nhiều hÆ¡n về Pydantic, tham khảo tài liệu cá»§a nó. + +**FastAPI** được dá»±a hoàn toàn trên Pydantic. + +Bạn sẽ thấy nhiều ví dụ thá»±c tế hÆ¡n trong [Hướng dẫn sá»­ dụng](tutorial/index.md){.internal-link target=_blank}. + +!!! tip + Pydantic có một hành vi đặc biệt khi bạn sá»­ dụng `Optional` hoặc `Union[Something, None]` mà không có giá trị mặc dịnh, bạn có thể đọc nhiều hÆ¡n về nó trong tài liệu cá»§a Pydantic về Required Optional fields. + + +## Type Hints với Metadata Annotations + +Python cÅ©ng có một tính năng cho phép đặt **metadata bổ sung** trong những gợi ý kiểu dữ liệu này bằng cách sá»­ dụng `Annotated`. + +=== "Python 3.9+" + + Trong Python 3.9, `Annotated` là một phần cá»§a thư viện chuẩn, do đó bạn có thể import nó từ `typing`. + + ```Python hl_lines="1 4" + {!> ../../../docs_src/python_types/tutorial013_py39.py!} + ``` + +=== "Python 3.6+" + + Ở phiên bản dưới Python 3.9, bạn import `Annotated` từ `typing_extensions`. + + Nó đã được cài đặt sẵng cùng với **FastAPI**. + + ```Python hl_lines="1 4" + {!> ../../../docs_src/python_types/tutorial013.py!} + ``` + +Python bản thân nó không làm bất kì điều gì với `Annotated`. Với các trình soạn thảo và các công cụ khác, kiểu dữ liệu vẫn là `str`. + +Nhưng bạn có thể sá»­ dụng `Annotated` để cung cấp cho **FastAPI** metadata bổ sung về cách mà bạn muốn ứng dụng cá»§a bạn xá»­ lí. + +Điều quan trọng cần nhớ là ***tham số kiểu dữ liệu* đầu tiên** bạn truyền tới `Annotated` là **kiểu giá trị thá»±c sá»±**. Phần còn lại chỉ là metadata cho các công cụ khác. + +Bây giờ, bạn chỉ cần biết rằng `Annotated` tồn tại, và nó là tiêu chuẩn cá»§a Python. 😎 + + +Sau đó, bạn sẽ thấy sá»± **mạnh mẽ** mà nó có thể làm. + +!!! tip + Thá»±c tế, cái này là **tiêu chuẩn cá»§a Python**, nghÄ©a là bạn vẫn sẽ có được **trải nghiệm phát triển tốt nhất có thể** với trình soạn thảo cá»§a bạn, với các công cụ bạn sá»­ dụng để phân tích và tái cấu trúc code cá»§a bạn, etc. ✨ + + Và code cá»§a bạn sẽ tương thích với nhiều công cụ và thư viện khác cá»§a Python. 🚀 + +## Các gợi ý kiểu dữ liệu trong **FastAPI** + +**FastAPI** lấy các ưu điểm cá»§a các gợi ý kiểu dữ liệu để thá»±c hiện một số thứ. + +Với **FastAPI**, bạn khai báo các tham số với gợi ý kiểu và bạn có được: + +* **Sá»± hỗ trợ từ các trình soạn thảo**. +* **Kiểm tra kiểu dữ liệu (type checking)**. + +...và **FastAPI** sá»­ dụng các khia báo để: + +* **Định nghÄ©a các yêu cầu**: từ tham số đường dẫn cá»§a request, tham số query, headers, bodies, các phụ thuộc (dependencies),... +* **Chuyển dổi dữ liệu*: từ request sang kiểu dữ liệu được yêu cầu. +* **Kiểm tra tính đúng đắn cá»§a dữ liệu**: tới từ mỗi request: + * Sinh **lỗi tá»± động** để trả về máy khác khi dữ liệu không hợp lệ. +* **Tài liệu hóa** API sá»­ dụng OpenAPI: + * cái mà sau được được sá»­ dụng bởi tài liệu tương tác người dùng. + +Điều này có thể nghe trừu tượng. Đừng lo lắng. Bạn sẽ thấy tất cả chúng trong [Hướng dẫn sá»­ dụng](tutorial/index.md){.internal-link target=_blank}. + +Điều quan trọng là bằng việc sá»­ dụng các kiểu dữ liệu chuẩn cá»§a Python (thay vì thêm các lớp, decorators,...), **FastAPI** sẽ thá»±c hiện nhiều công việc cho bạn. + +!!! info + Nếu bạn đã đi qua toàn bộ các hướng dẫn và quay trở lại để tìm hiểu nhiều hÆ¡n về các kiểu dữ liệu, một tài nguyên tốt như "cheat sheet" từ `mypy`.