Hướng dẫn

Áp dụng static typing trong Python với Mypy

12 / 09 / 2016

Ở một số ngôn ngữ thì static typing là cách duy nhất để sử dụng. Còn Python thì sử dụng dynamic typing nghĩa là khi một biến được gán một giá trị ở kiểu dữ liệu này (ví dụ là kiểu int) thì sau đó nó có thể lưu giá trị của một kiểu dữ liệu khác (string). Tuy nhiên, trong một vài ứng dụng thì điều này sẽ dẫn tới lỗi vì khối code muốn nhận giá trị từ một kiểu dữ liệu nhưng lập trình viên lại truyền vào một kiểu khác.

Python 3.5 giới thiệu tiêu chuẩn cho việc đánh dấu (annotation) tại những vị trí mã nguồn mà các tham số truyền vào hàm phải là kiểu dữ liệu nào và hàm cần trả về kiểu dữ liệu nào. Nhưng việc kiểm tra dữ liệu lại chỉ ở việc thực hiện đánh dấu mà bạn có thể nhìn trong mã nguồn, khi thực thi thì chúng sẽ bị bỏ đi. Như vậy, có nghĩa là việc kiểm tra kiểu dữ liệu không đảm bảo lúc thực thi.

>>> def add(a: int, b: int) -> int:
...     return a+b
...

Ví dụ, hàm ở trên sẽ thực hiện cộng hai giá trị vào nhau. Việc đánh dấu kiểu dữ liệu (type hint) cho thấy kiểu số truyền vào hàm và kết quả trả về phải là kiểu int.

Vậy xem thử nếu chúng ta gọi hàm trên thì kết quả sẽ như thế nào:

>>> add(1, 5)
6
>>> add('a', '3')
'a3'

Như bạn thấy thì ở đây có thể truyền vào bất cứ kiểu dữ liệu nào và cũng trả về kiểu dữ liệu có độ ưu tiên hơn trong phép tính cộng, và điều này có vẻ không như mong đợi cho hàm tính tổng cho hai số nguyên.

mypy là một thư viện sẽ hỗ trợ việc type-hint và đưa ra các thông báo nếu như lập trình viên đang gọi hàm với kiểu dữ liệu không hợp lệ. 

Hãy thử chuyển ví dụ ở trên áp dụng với mypy xem thế nào:

__author__ = 'PeteHouston'

def add(a: int, b: int) -> int:
    return a + b

if __name__ == '__main__':
    print(add(1, 5))
    print(add('a', '3'))

Lúc này, khi thực hiện gọi hàm, bạn sẽ thấy có thông báo warning về kiểu dữ liệu:

mypy code.py
code.py:6: error: Argument 1 to "add" has incompatible type "str"; expected "int"
code.py:6: error: Argument 2 to "add" has incompatible type "str"; expected "int"

Mặc dù đoạn code vẫn thực thi và chạy ra kết quả bình thường (tất nhiên là có kết quả không đúng với kiểu dữ liệu không đúng), nhưng ít nhất thì chúng ta cũng biết được là những đoạn đang sử dụng kiểu dữ liệu không đúng khi thực hiện gọi hàm nhờ vào các thông báo warning của mypy.

mypy là một thư viện khá hữu ích nếu như bạn quan tâm tới việc sử dụng kiểu dữ liệu chuẩn và chính xác trong ứng dụng của bạn. mypy được mở mã nguồn trên Github, các bạn có thể tham gia đóng góp để dự án trở nên tốt hơn.


Quay lại danh sách
CHIA SẺ BÀI VIẾT
KodeMate
Chat với chúng tôi Chat với chúng tôi - kodemate.com