PHP
Python

Trang chủ

Function Annotations trong Python

Ngôn ngữ Python là một ngôn ngữ lập trình đa mục đích, nổi tiếng với cú pháp dễ đọc, dễ học và tính ứng dụng cao. Trong lĩnh vực phát triển web, Python thường được sử dụng thông qua các framework như Django và Flask để xây dựng các ứng dụng web mạnh mẽ, bảo mật và dễ mở rộng. Trong chuyên mục này, Vietnix không chỉ cung cấp kiến thức nền tảng về ngôn ngữ Python mà còn hướng dẫn chi tiết cách xây dựng các ứng dụng web thực tế, sử dụng các framework phổ biến và áp dụng các kỹ thuật tiên tiến. Vietnix cam kết liên tục cập nhật những bài viết mới nhất về các tính năng mới của Python, các thư viện hỗ trợ hữu ích và những phương pháp tốt nhất, giúp bạn khai thác tối đa sức mạnh của Python và hoàn thiện kỹ năng lập trình web của mình.
html
CSS
javascript
sql
python
php
c
c++
bootstrap
react
mysql
reactjs
vuejs
Javascript Tutorials
10/01/2025
12 phút đọc
Theo dõi Vietnix trên

Function Annotations trong Python

Trong Python, Function Annotations là một tính năng cho phép bạn thêm các thông tin chú thích tùy ý vào hàm (function), liên quan đến các tham số (parameter) đầu vào và giá trị trả về của nó. Các thông tin chú thích này thường được biểu diễn dưới dạng các kiểu dữ liệu. Tìm hiểu chi tiết về cách sử dụng Function Annotations, từ những ví dụ cơ bản đến nâng cao, thông qua các nội dung bên dưới của bài viết này.

Function Annotations trong Python là gì?

Function Annotations trong Python cho phép bạn thêm vào các thông tin mô tả bổ sung về các tham số được khai báo trong định nghĩa của một hàm, cũng như về kiểu dữ liệu trả về của hàm đó. Mặc dù trình thông dịch Python sẽ không xem xét đến các chú thích này trong quá trình thực thi hàm, chúng lại đặc biệt hữu ích đối với các IDE (Môi trường phát triển tích hợp) của Python. Chú thích cung cấp tài liệu chi tiết hơn cho lập trình viên.

Function Annotations trong Python cho phép bạn thêm vào các thông tin mô tả bổ sung về các tham số
Function Annotations trong Python cho phép bạn thêm vào các thông tin mô tả bổ sung về các tham số

Mặc dù bạn có thể dùng tính năng docstring của Python để tài liệu hóa một hàm, docstring có thể trở nên lỗi thời nếu có những thay đổi nhất định trong khai báo hàm. Vì vậy, tính năng chú thích hàm (annotation) đã được giới thiệu trong Python theo PEP 3107.

Chú thích là bất kỳ biểu thức Python hợp lệ nào được thêm vào tham số hoặc kiểu dữ liệu trả về của hàm. Ví dụ đơn giản nhất của việc sử dụng chú thích là để chỉ định kiểu dữ liệu của tham số. Việc thêm chú thích sẽ được thực hiện bằng cách đặt dấu hai chấm (:) phía sau tham số, rồi theo sau là biểu thức mô tả chú thích.

Ví dụ

Lưu ý: là Python là ngôn ngữ kiểu động, và không bắt buộc phải kiểm tra kiểu dữ liệu trong quá trình chạy. Do đó, việc chú thích tham số với các kiểu dữ liệu không hề có bất kỳ ảnh hưởng nào trong lúc hàm được gọi. Ngay cả khi tham số không đúng kiểu được truyền vào hàm, Python vẫn sẽ không phát hiện ra lỗi.

Hãy xem qua ví dụ dưới đây:

def tinh_tong(x: int, y: int) -> int:
    tong = x + y
    return tong

print(tinh_tong(5, 7))
print(tinh_tong("Xin chào", "Python!"))

Khi thực thi đoạn code trên, kết quả sẽ được in ra như sau:

12
Xin chàoPython!

Giải thích code:

  • def tinh_tong(x: int, y: int) -> int:: Dòng này khai báo một hàm có tên là tinh_tong, nhận vào hai tham số là xy. Cả hai tham số này đều được chú thích (annotation) là kiểu số nguyên int, và hàm được chú thích sẽ trả về một giá trị kiểu số nguyên int.
  • tong = x + y: Trong thân hàm, phép cộng của xy sẽ được gán vào biến tong.
  • return tong: Câu lệnh trả về giá trị biến tong.
  • print(tinh_tong(5, 7)): Dòng này gọi hàm tinh_tong với hai tham số là số nguyên và in kết quả ra màn hình.
  • print(tinh_tong("Xin chào", "Python!")): Dòng này gọi hàm tinh_tong với hai tham số là chuỗi ký tự và in kết quả ra màn hình. Kết quả vẫn được thực hiện một cách bình thường dù bạn truyền vào hàm tham số khác kiểu dữ liệu. Điều này cho thấy, dù ta có sử dụng chú thích thì nó cũng không có tác dụng ép kiểu trong Python.

Function Annotations với dữ liệu trả về

Mặc dù các chú thích bị bỏ qua trong quá trình chạy, nhưng chúng lại rất hữu ích cho các IDE (môi trường phát triển tích hợp) và các thư viện kiểm tra kiểu tĩnh như mypy.

Ngoài việc chú thích cho tham số, bạn cũng có thể cung cấp chú thích cho kiểu dữ liệu trả về của hàm. Cách thực hiện là đặt một dấu mũi tên (->) ngay sau dấu ngoặc đơn đóng và trước dấu hai chấm (:), tiếp theo là chú thích kiểu dữ liệu trả về.

Ví dụ

Ví dụ sau đây sẽ giúp bạn hiểu hơn về chú thích cho kiểu dữ liệu trả về của hàm:

def tinh_tich(x: float, y: float) -> float:
  tich = x * y
  return tich

print(tinh_tich(3.5, 2.0))
print(tinh_tich.__annotations__)

Khi chạy đoạn code trên, bạn sẽ thấy kết quả:

7.0
{‘x’: , ‘y’: , ‘return’: }

Giải thích code:

  • def tinh_tich(x: float, y: float) -> float:: Dòng này khai báo một hàm có tên là tinh_tich, nhận vào hai tham số là xy, đều được chú thích kiểu dữ liệu float. Hàm này cũng được chú thích sẽ trả về một giá trị kiểu float.
  • tich = x * y: Thực hiện phép nhân giữa hai tham số xy, kết quả gán cho biến tich.
  • return tich: Trả về giá trị biến tich.
  • print(tinh_tich(3.5, 2.0)): Câu lệnh này gọi hàm tinh_tich với hai số thực làm đối số, và in ra kết quả trả về.
  • print(tinh_tich.__annotations__): Dòng này in ra thuộc tính __annotations__ của hàm tinh_tich, nó là một từ điển (dictionary) lưu trữ các thông tin về chú thích của các tham số và kiểu trả về của hàm.

Function Annotations với biểu thức

Như đã thấy ở phần trước, việc sử dụng kiểu dữ liệu làm chú thích không có tác dụng ép kiểu khi chương trình chạy, nên bạn có thể sử dụng bất kỳ biểu thức nào như là metadata (dữ liệu mô tả) cho tham số. Điều này có nghĩa là một hàm có thể có biểu thức bất kỳ làm chú thích.

Ví dụ

Trong ví dụ dưới đây, ta sử dụng một biểu thức làm chú thích cho hàm:

def tinh_diem_tong(toan: 'Điểm môn Toán', ly: 'Điểm môn Lý'):
    return toan + ly

print(tinh_diem_tong(9, 8))
print(tinh_diem_tong.__annotations__)

Kết quả khi chạy đoạn code trên như sau:

17
{‘toan’: ‘Điểm môn Toán’, ‘ly’: ‘Điểm môn Lý’}

Giải thích code:

  • def tinh_diem_tong(toan: 'Điểm môn Toán', ly: 'Điểm môn Lý'):: Ở đây, hàm tinh_diem_tong nhận vào hai tham số là toanly, cả hai đều được chú thích (annotation) bằng chuỗi, mô tả ý nghĩa của các tham số đó.
  • return toan + ly: Hàm trả về tổng hai tham số toanly.
  • print(tinh_diem_tong(9, 8)): Dòng này gọi hàm tinh_diem_tong và in ra kết quả.
  • print(tinh_diem_tong.__annotations__): Câu lệnh này in ra một từ điển chứa các thông tin chú thích của hàm, ở đó key là tên các tham số và value là chú thích tương ứng.

Function Annotations kết hợp Default Arguments

Khi muốn thiết lập một giá trị mặc định cho tham số đồng thời vẫn sử dụng chú thích, bạn cần đặt giá trị mặc định đó sau biểu thức chú thích. Điều quan trọng cần nhớ là các tham số mặc định phải luôn đứng sau các tham số bắt buộc trong danh sách tham số của hàm.

Ví dụ 1

Ví dụ sau đây minh họa cách cung cấp chú thích cho các đối số mặc định của một hàm.

def tinh_diem(a: "Điểm kiểm tra", b: "Điểm quá trình" = 10) -> int:
  diem_tong = a + b
  return diem_tong

print(tinh_diem(9))

Trong Python, hàm cũng là một đối tượng (object), và một trong những thuộc tính của đối tượng hàm là __annotations__. Chúng ta có thể kiểm tra điều này thông qua hàm dir().

print(dir(tinh_diem))

Đoạn code trên sẽ in ra danh sách các thuộc tính của đối tượng hàm tinh_diem, và trong đó sẽ có thuộc tính __annotations__. Kết quả hiển thị sẽ tương tự như sau:

[‘__annotations__’, ‘__builtins__’, ‘__call__’, ‘__class__’, ‘__closure__’, ‘__code__’, ‘__defaults__’, ‘__delattr__’, ‘__dict__’, ‘__dir__’, ‘__doc__’, ‘__eq__’, ‘__format__’, ‘__ge__’, ‘__get__’, ‘__getattribute__’, ‘__getstate__’, ‘__globals__’, ‘__gt__’, ‘__hash__’, ‘__init__’, ‘__init_subclass__’, ‘__kwdefaults__’, ‘__le__’, ‘__lt__’, ‘__module__’, ‘__name__’, ‘__ne__’, ‘__new__’, ‘__qualname__’, ‘__reduce__’, ‘__reduce_ex__’, ‘__repr__’, ‘__setattr__’, ‘__sizeof__’, ‘__str__’, ‘__subclasshook__’]

Giải thích code:

  • def tinh_diem(a: "Điểm kiểm tra", b: "Điểm quá trình" = 10) -> int:: Dòng này định nghĩa hàm tinh_diem có hai tham số. Tham số a được chú thích là “Điểm kiểm tra” và là tham số bắt buộc. Tham số b được chú thích là “Điểm quá trình”, có giá trị mặc định là 10 và là tham số tùy chọn. Hàm được chú thích kiểu trả về là int.
  • diem_tong = a + b: Trong thân hàm, chúng ta sẽ thực hiện tính tổng của ab sau đó lưu vào biến diem_tong.
  • return diem_tong: Hàm trả về tổng của 2 tham số.
  • print(tinh_diem(9)): Dòng này gọi hàm tinh_diem chỉ với một tham số (tức tham số a). Do b có giá trị mặc định, Python sẽ sử dụng giá trị mặc định đó khi hàm được gọi, sau đó in ra kết quả.
  • print(dir(tinh_diem)): Dòng lệnh này dùng để in ra danh sách tất cả các thuộc tính của đối tượng tinh_diem, và chúng ta thấy rằng, có thuộc tính là __annotations__. Thuộc tính này được Python sử dụng để lưu trữ các chú thích hàm.

Ví dụ 2

Thuộc tính __annotations__ thực chất là một từ điển (dictionary), trong đó các tham số của hàm là khóa (key), còn các chú thích tương ứng là giá trị (value).

def tinh_toan(x: "số thứ nhất", y: "số thứ hai" = 5) -> float:
  ket_qua = x + y
  return ket_qua

print(tinh_toan.__annotations__)

Kết quả sẽ hiển thị trên màn hình:

{‘x’: ‘số thứ nhất’, ‘y’: ‘số thứ hai’, ‘return’: }

Giải thích code:

  • def tinh_toan(x: "số thứ nhất", y: "số thứ hai" = 5) -> float:: Hàm này nhận 2 tham số với chú thích tương ứng và có kiểu trả về là float
  • print(tinh_toan.__annotations__): Lệnh này in ra thuộc tính __annotations__ của hàm tinh_toan. Thuộc tính này là một từ điển (dictionary) chứa các chú thích của hàm.

Ví dụ 3

Một hàm có thể có tham số vị trí tùy ý (*args) hoặc tham số từ khóa tùy ý (**kwargs). Chúng ta hoàn toàn có thể sử dụng chú thích cho các tham số này.

def thong_tin_them(*args: "Danh sách thông tin", **kwargs: "Thông tin chi tiết") -> None:
    pass
print (thong_tin_them.__annotations__)

Kết quả khi chạy đoạn code này:

{‘args’: ‘Danh sách thông tin’, ‘kwargs’: ‘Thông tin chi tiết’, ‘return’: }

Giải thích code:

  • def thong_tin_them(*args: "Danh sách thông tin", **kwargs: "Thông tin chi tiết") -> None:: Hàm này định nghĩa 2 tham số là *args (tham số vị trí tùy ý) và **kwargs (tham số từ khóa tùy ý), đều được chú thích bằng chuỗi. Hàm có kiểu trả về là None.
  • print(thong_tin_them.__annotations__): In ra thuộc tính __annotations__ của hàm.

Ví dụ 4

Trong trường hợp bạn muốn cung cấp nhiều hơn một biểu thức chú thích cho một tham số của hàm, bạn có thể sử dụng một đối tượng từ điển (dictionary) ngay trước tham số đó.

def chia_so(num: dict(type=float, msg='số bị chia'), den: dict(type=float, msg='số chia')) -> float:
   return num / den

print(chia_so.__annotations__)

Đoạn mã trên khi chạy sẽ cho ra kết quả như sau:

{‘num’: {‘type’: , ‘msg’: ‘số bị chia’}, ‘den’: {‘type’: , ‘msg’: ‘số chia’}, ‘return’: }

Giải thích code:

  • def chia_so(num: dict(type=float, msg='số bị chia'), den: dict(type=float, msg='số chia')) -> float:: Ở đây, ta định nghĩa hàm chia_so có hai tham số:
    • num (số bị chia) được chú thích bằng một dictionary. Dictionary này chỉ ra type (kiểu dữ liệu) là floatmsg (thông báo) là 'số bị chia'.
    • den (số chia) cũng được chú thích bằng một dictionary tương tự, với typefloatmsg'số chia'.
  • Hàm được chú thích kiểu trả về là float (số thực).
  • return num / den: Hàm thực hiện phép chia số bị chia cho số chia và trả về kết quả.
  • print(chia_so.__annotations__): Dòng lệnh này truy cập và in ra thuộc tính __annotations__ của hàm chia_so, cho phép chúng ta xem tất cả các chú thích mà chúng ta đã thiết lập.

Lời kết

Vậy là chúng ta đã cùng nhau tìm hiểu chi tiết về Function Annotations trong Python, từ khái niệm, cách sử dụng đến những lợi ích mà tính năng này mang lại. Hy vọng rằng, thông qua bài viết này, bạn đã có thêm một công cụ hữu ích để viết code Python rõ ràng, dễ đọc và bảo trì hơn. Chúc bạn thành công trên hành trình khám phá ngôn ngữ lập trình thú vị này

Cao Lê Viết Tiến

PHP Leader
tại
Vietnix

Kết nối với mình qua

Icon Quote
Icon Quote

Học lập trình online cùng vietnix

Học lập trình online cùng Vietnix

PHPXem thêmThu gọn