Python - Function Annotations

Function Annotations

Tính năng chú thích hàm của Python cho phép bạn thêm siêu dữ liệu giải thích bổ sung về các tham số được khai báo trong định nghĩa hàm, cũng như kiểu dữ liệu trả về. Chúng không được coi là Python interpreter khi thực thi function . Chúng chủ yếu dành cho các IDE Python để cung cấp tài liệu chi tiết cho lập trình viên.

Mặc dù bạn có thể sử dụng tính năng docstring của Python để tài liệu cho một hàm, nhưng nó có thể trở nên lỗi thời nếu có những thay đổi nhất định trong nguyên mẫu của hàm. Do đó, tính năng chú thích đã được giới thiệu trong Python như một kết quả của PEP 3107.

Chú thích (Annotations) là bất kỳ biểu thức Python hợp lệ nào được thêm vào các tham số hoặc kiểu dữ liệu trả về. Ví dụ đơn giản nhất của chú thích là quy định kiểu dữ liệu của các tham số. Chú thích được đề cập dưới dạng một biểu thức sau khi đặt dấu hai chấm (:) trước tham số.

Example

Hãy nhớ rằng Python là một ngôn ngữ kiểu động và không thực thi bất kỳ kiểm tra kiểu nào trong thời gian chạy. Do đó, việc chú thích các đối số với data types không có tác dụng khi gọi hàm. Ngay cả khi các đối số không phải là số nguyên được cung cấp, Python cũng không phát hiện ra bất kỳ lỗi nào.

def myfunction(a: int, b: int):
   c = a+b
   return c
   
print (myfunction(10,20))
print (myfunction("Hello ", "Python"))

Nó sẽ tạo ra output

30
Hello Python

Function Annotations With Return Type

Các chú thích (annotations) sẽ bị bỏ qua khi chạy chương trình, nhưng chúng rất hữu ích cho các IDE và các thư viện kiểm tra kiểu tĩnh như mypy.

Bạn có thể cung cấp chú thích cho kiểu dữ liệu trả về. Sau dấu ngoặc đơn và trước ký hiệu hai chấm, hãy đặt một mũi tên (->) theo sau là chú thích.

Example

Trong ví dụ này, chúng tôi đang cung cấp chú thích cho kiểu trả về.

def myfunction(a: int, b: int) -> int:
   c = a+b
   return c
print(myfunction(56,88))
print(myfunction.__annotations__)

Điều này sẽ tạo ra đầu ra sau −

144
{'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}

Function Annotations With Expression

Vì việc sử dụng kiểu dữ liệu làm chú thích sẽ bị bỏ qua tại thời điểm chạy, bạn có thể đặt bất kỳ biểu thức nào làm siêu dữ liệu cho các tham số. Do đó, hàm có thể có bất kỳ biểu thức tùy ý nào làm chú thích.

Example

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

def total(x : 'marks in Physics', y: 'marks in chemistry'):
   return x+y
print(total(86, 88))
print(total.__annotations__)

Dưới đây là đầu ra −

174
{'x': 'marks in Physics', 'y': 'marks in chemistry'}

Function Annotations With Default Arguments

Nếu bạn muốn chỉ định một default argument cùng với chú thích, bạn cần đặt nó sau biểu thức chú thích. Các tham số mặc định phải đứng sau các tham số bắt buộc trong danh sách tham số.

Example 1

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

def myfunction(a: "physics", b:"Maths" = 20) -> int:
   c = a+b
   return c
print (myfunction(10))

Hàm trong Python cũng là một object , và một trong những thuộc tính của nó là __annotations__. Bạn có thể kiểm tra bằng hàm dir().

print (dir(myfunction))

Điều này sẽ in ra danh sách đối tượng myfunction chứa __annotations__ như một trong những thuộc tính.

['__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__']

Example 2

Thuộc tính __annotations__ chính nó là một dictionary trong đó các đối số là các khóa và các chú thích là giá trị của chúng.

def myfunction(a: "physics", b:"Maths" = 20) -> int:
   c = a+b
   return c
print (myfunction.__annotations__)

Nó sẽ tạo ra output

{'a': 'physics', 'b': 'Maths', 'return': <class 'int'>}

Example 3

Bạn có thể có các đối số vị trí tùy ý và/hoặc các đối số từ khóa tùy ý cho một hàm. Các chú thích cũng có thể được cung cấp cho chúng.

def myfunction(*args: "arbitrary args", **kwargs: "arbitrary keyword args") -> int:
   pass
print (myfunction.__annotations__)

Nó sẽ tạo ra output

{'args': 'arbitrary args', 'kwargs': 'arbitrary keyword args', 'return': <class 'int'>}

Example 4

Trong trường hợp bạn cần cung cấp nhiều biểu thức chú thích cho một tham số hàm, hãy đưa nó dưới dạng một đối tượng từ điển trước tham số đó.

def division(num: dict(type=float, msg='numerator'), den: dict(type=float, msg='denominator')) -> float:
   return num/den
print (division.__annotations__)

Nó sẽ tạo ra output

{'num': {'type': <class 'float'>, 'msg': 'numerator'}, 'den': {'type': <class 'float'>, 'msg': 'denominator'}, 'return': <class 'float'>}