Python – Fullstack Station https://fullstackstation.com Hướng dẫn lập trình, thiết kế, lập trình web, thiết kế web, lập trình javascript, lập trình fullstack từ cơ bản đến nâng cao Wed, 24 Apr 2024 08:24:44 +0000 vi hourly 1 https://wordpress.org/?v=6.8.3 https://fullstackstation.com/wp-content/uploads/2019/08/favicon.ico Python – Fullstack Station https://fullstackstation.com 32 32 Python: Sự cần thiết của MyPy https://fullstackstation.com/gioi-thieu-mypy-python/ https://fullstackstation.com/gioi-thieu-mypy-python/#respond Wed, 24 Apr 2024 08:24:43 +0000 https://fullstackstation.com/?p=1948 Nhân việc người tạo ra Python, ông Guido van Rossum giới thiệu về MyPy, mình sẽ nói kỹ thêm về sự hữu dụng và sự cần thiết của MyPy trong lập trình Python. Bạn có thể tải về slide của ông Guido van Rossum ở cuối bài. Mình đã giới thiệu MyPy trong bài viết […]

The post Python: Sự cần thiết của MyPy appeared first on Fullstack Station.

]]>
Nhân việc người tạo ra Python, ông Guido van Rossum giới thiệu về MyPy, mình sẽ nói kỹ thêm về sự hữu dụng và sự cần thiết của MyPy trong lập trình Python. Bạn có thể tải về slide của ông Guido van Rossum ở cuối bài.

Mình đã giới thiệu MyPy trong bài viết “Giới thiệu một số công cụ hỗ trợ lập trình Python“, bài này sẽ đề cập chi tiết hơn về MyPy. Bất kỳ ngôn ngữ nào cũng phải trải qua quá trình dài để phát triển. Việc thiếu một vài tính năng ngay từ đầu cũng không có gì lạ, vì nguyên tắc thiết kế của Python là đặt sự đơn giản lên hàng đầu.

The Zen of Python (import this):

  • Beautiful is better than ugly.
  • Explicit is better than implicit.
  • Simple is better than complex.
  • Complex is better than complicated.
  • Flat is better than nested.
  • Sparse is better than dense.
  • Readability counts.
  • Special cases aren’t special enough to break the rules.
  • Although practicality beats purity.
  • Errors should never pass silently.
  • Unless explicitly silenced.
  • In the face of ambiguity, refuse the temptation to guess.
  • There should be one– and preferably only one –obvious way to do it.
  • Although that way may not be obvious at first unless you’re Dutch.
  • Now is better than never.
  • Although never is often better than right now.
  • If the implementation is hard to explain, it’s a bad idea.
  • If the implementation is easy to explain, it may be a good idea.
  • Namespaces are one honking great idea — let’s do more of those!

Tuy nhiên, sự cần thiết của kiểm tra kiểu dữ liệu là rất quan trọng, dù nó đã không được hỗ trợ ngay từ lúc ban đầu. Hoặc cũng không là bắt buộc ở hiện tại. Không biết ông Guido hối hận gì không vì đã không đưa type-checking vào Python trước đây :D.

MyPy là gì

Ngày nay, nhiều công cụ để kiểm tra kiểu dữ liệu, nhưng MyPy trước đây được tạo ra bởi anh JukkaL, thì bây giờ đã được đưa chính thức vào chung với Python: https://github.com/python/mypy. Đó là một sự thừa nhận sự phát triển và trưởng thành của MyPy.

Type Annotation

Type checking (kiểm tra kiểu dữ liệu) là xác định rõ kiểu dữ liệu của biến, giúp phát hiện lỗi sớm hơn trong quá trình phát triển. MyPy là công cụ được sử dụng để kiểm tra các lỗi liên quan đến loại dữ liệu dựa trên type annotations.

Ví dụ:

def add(x, y):    
    return x + y

add("hai", "ba")
=> "haiba" # Kiểu string
add(2, 3)
=> 5 # Kiểu integer

add("hai", 3)
hoặc 
add(2, "ba")
=> chúng ta sẽ bị lỗi `TypeError` lúc Runtime

Vậy thì với cách viết thêm kiểu dữ liệu như dưới đây:

def add(x: int, y: int) -> int:    
    return x + y

Khi dùng MyPy để kiểm tra, thì chúng ta sẽ phát hiện ngay được lỗi trong lúc lập trình mà không sợ sẽ bị lỗi lúc runtime nữa. Python khá dễ viết nếu mã nguồn đơn giản, ngắn gọn và còn mới. Nhưng khi mã nguồn dự án trải qua thời gian dài, và lượng code phình to ra thì nếu không có xác định, kiểm tra loại dữ liệu thì sẽ gặp rất nhiều khó khăn khi debug hoặc khó hiểu khi đọc code.

Type T

Sử dụng với các kiểu dữ liệu

Kiểu dữ liệu cơ bản

Bạn có thể dùng tất cả các kiểu dữ liệu cơ bản để diễn giải kiểu dữ liệu như int, float, str, dict, tuple, set, list…, hoặc kết hợp như Tuple[int, str], Iterator[int]…

def gcd(a: int, b: int) -> int:
    while a:
        a, b = b % a, a
    return b

Ở đây mình dùng VSCode, đưa trỏ chuột vào b sẽ biết b có kiểu dữ liệu gì

Hay với ví dụ của trang chủ mypy:

from typing import Iterator

def fib(n: int) -> Iterator[int]:
    a, b = 0, 1
    while a < n:
        yield a
        a, b = b, a + b

Loại biến gọi hàm (Callable)

from typing import Callable

def twice(i: int, next: Callable[[int], int]) -> int:    
    return next(next(i))

def add(i: int) -> int:
    return i + 1

print(twice(3, add))  # 5

Với ví dụ trên, bạn có thể xác định biến đưa vào có thể gọi hàm, rất tường minh.

Kiểu dữ liệu nâng cao

Sử dụng MyPy tuy dễ nhưng cũng cần thời gian để thành thạo, bạn có thể cải thiện Type-Annotation từng bước nhỏ một. Không nhất thiết phải làm 1 lúc cho toàn bộ mã nguồn của dự án. Như vậy sẽ không bị ngán và lười.

Tuy nhiên với dự án mới thì hãy sử dụng Type-Annotation càng nhiều càng tốt. Vừa lập trình vừa có trợ lý MyPy thật là sướng biết bao.

https://mypy.readthedocs.io/en/latest/

MyPy cho Django: https://github.com/machinalis/mypy-django

The post Python: Sự cần thiết của MyPy appeared first on Fullstack Station.

]]>
https://fullstackstation.com/gioi-thieu-mypy-python/feed/ 0
Tại sao nên học Python? https://fullstackstation.com/tai-sao-nen-hoc-python/ https://fullstackstation.com/tai-sao-nen-hoc-python/#comments Fri, 02 Aug 2019 09:00:35 +0000 http://fullstackstation.com/?p=1803 Python đã lần đầu tiên đạt được vị trí 3 trên bảng xếp hạng Tiobe Index, với mức tăng +2.90%, vượt qua C++ tại thời điểm tháng 7/2019. Với một tín hiệu tích cực, quá rõ ràng cho xu hướng của Python. Bài này mình sẽ điểm qua các giá trị của Python để trả […]

The post Tại sao nên học Python? appeared first on Fullstack Station.

]]>
Python đã lần đầu tiên đạt được vị trí 3 trên bảng xếp hạng Tiobe Index, với mức tăng +2.90%, vượt qua C++ tại thời điểm tháng 7/2019. Với một tín hiệu tích cực, quá rõ ràng cho xu hướng của Python. Bài này mình sẽ điểm qua các giá trị của Python để trả lời câu hỏi “Tại sao nên học Python” từ bây giờ?

Python ở Tiobe Index: https://www.tiobe.com/tiobe-index/python/

Đôi nét sơ lược về Python

Python là một ngôn ngữ lập trình thông dịch, tương tác, hướng đối tượng và là ngôn ngữ bậc cao, có mục đích chung chung. Được tạo ra bởi Guido van Rossum trong giai đoạn 1985 – 1990. Python là ngôn ngữ của năm 2018 theo bảng xếp hạng Tiobe Index, hạng 3 là thứ hạng cao nhất đạt được.

Lý do Youtube được Google mua lại một phần là vì Python đã được sử dụng trong nền tảng này để tạo ra, phát hành tính năng nhanh hơn Google Video tại thời điểm 2006. Nền tảng youtube lúc đó chỉ có khoảng 20 lập trình viên so với hàng trăm kỹ sư giỏi của Google sử dụng C/C++.

Những điểm mạnh của Python

Mục đích chung chung/General-purpose

Do đặc tính mục đích chung chung của Python, nên Python có thể sử dụng được ở rất nhiều lĩnh vực. Hầu như tất cả ngoại trừ xử lý giao diện ở trình duyệt. Ở độ bao phủ này thì Python chỉ thua mỗi JS, nhưng bù lại Python lại mạnh hơn JS ở mảng về AI. Như vậy nếu bạn có thể lập trình được Python thì có thể làm được rất nhiều việc. Python cũng phù hợp cho các bạn yêu thích khởi nghiệp. Chính vì độ uyển chuyển và thiết kế ra sản phẩm nhanh của Python.

Tương tác/Interactive

Tính năng tương tác nghĩa là bạn có thể truy cập vào shell của python bằng lệnh python. Sau đó có thể viết mã hàm (function), lớp (class) hoặc sử dụng các hàm tích hợp sẵn của python. Không nhiều ngôn ngữ lập trình hỗ trợ tính năng tương tác này. Chỉ có 1 vài ngôn ngữ khác không phổ biến và được sử dụng rộng rãi như lisps (bao gồm lisp, scheme gồm clojure), sml, ocaml, haskell, F#, erlang, scala, ruby, python, lua, groovy, prolog.

Sử dụng thư viện/Import

Cách quản lý thư viện của Python khá linh động, bạn có thể import một hàm; hay class từ thư viện có sẵn, hoặc được cài đặt từ bên thứ ba, hay từ thư mục của dự án. Khái niệm import này sẽ gần giống với Nodejs, PHP hoặc các ngôn ngữ khác. Tuy nhiên điểm khác biệt lớn nhất là có thể sử dụng cùng tên hàm cho từng mô đun (module) khác nhau.

Tính rõ ràng, dễ đọc hiểu/Readability & simplicity

Ví dụ xét đoạn mã sau:

// Python
x = 12
y = 5
result = x / y
if result > 5.5:
    print("12 divided by 5 is greater than 5.5)
else
    print("12 divided by 5 is NOT greater than 5.5)
// C++
#include <iostream>
int main()
{
    double x = 12;
    double y = 5;
    double result = x / y;
    if(result > 5.5)
        std::cout << "12 divided by 5 is greater than 5.5" << std::endl;
    else
        std::cout << "12 divided by 5 is NOT greater than 5.5" << std::endl;
    return 0;
}

Rõ ràng với 1 người chưa biết lập trình thì đoạn mã 1 với Python dễ đọc và dễ hiểu hơn nhiều so với C++. Ngay cả so sánh với JS hay PHP thì Python vẫn vượt trội hơn về tính dễ đọc, dễ hiểu. Python sử dụng cú pháp tương tự tiếng Anh, vì tương tự ngôn ngữ con người nên dễ tiếp thu hơn. Đó cũng là lý do vì sao Python đang dần trở thành ngôn ngữ lập trình được dùng để dạy cho trẻ em.

Những điểm yếu/vấn đề của Python

Khác biệt về cú pháp so với ngôn ngữ khác

Gọi là điểm yếu thì không hẳn, nhưng so với các ngôn ngữ khác như PHP, JS, C, Java thì có dấu chấm kết thúc dòng, có các cặp {} để phân biệt khối, khối trong Python sẽ do số lượng khoảng trắng quy định (indent). Sẽ khiến bạn khó khăn 1 chút khi mới tiếp cận Python, cũng dễ xảy ra lỗi hơn nếu sai indent.

Không thể triển khai trên di động

Python hoạt động tốt ở môi trường máy chủ và ứng dụng máy tính để bàn (desktop applications), tuy nhiên ở trên điện thoại di động thì vẫn chưa có nền tảng nào hỗ trợ. So sánh 1 chút với Nodejs với React Native hay Dart với Flutter thì độ phủ thấp hơn. Với Nodejs và Dart có thể sử dụng cho ứng dụng di động đồng thời cho cả ở máy chủ và ứng dụng máy tính để bàn.

Tốc độ thực thi chậm

Python thực thi chậm hơn PHP 7, Nodejs là điều đã được kiểm chứng, cũng nhiều benchmark được thực hiện rồi. Nếu bạn thực sự đã có ý tưởng sản phẩm và tốc độ thực thi là bắt buộc, thì đây là 1 rào cản khó khăn. Nhưng nếu sử dụng Pypy, hoặc Cython, Numba để cải thiện và nhận lấy lợi ích khác từ Python và hi sinh một phần tốc độ thì cũng không phải là không tốt.

Lỗi run-time

Vì là ngôn ngữ kiểu động (dynamic typed) vì vậy khi chạy (run-time) chương trình Python có thể vẫn xảy ra lỗi về kiểu dữ liệu. Bạn sẽ phải sử dụng try/catch tốt hoặc cải thiện bằng các công cụ checker, linter.

Tại sao Python lại tăng trưởng nhanh như vậy?

Kỷ nguyên AI

Python được sử dụng nhiều trong kỷ nguyên AI khi mà tốc độ thực thi không quá quan trọng bằng tốc độ tính toán của GPU. Còn khả năng của Python thì được ứng dụng thích hợp vì dễ hiểu, dễ bảo trì. Để làm ra sản phẩm thông minh, tính năng AI có thể được huấn luyện hàng trăm giờ nhờ GPU. Trước đó còn có công việc xử lý số liệu, làm prototype…, tất cả những tác vụ này thì Python phù hợp nhất. Vì phần lớn thời gian được thực hiện bằng GPU, nên tốc độ thực thi của C/C++ hay Java không còn là điểm mạnh.

Dành cho các bạn làm Data Science, Python có thư viện Streamlit rất hữu dụng để làm báo cáo, demo.

Blockchain & IOT (Internet of things)

Bạn có thể thiết kế 1 blockchain đơn giản với 50 dòng code! Đây là điều tuyệt vời để bắt đầu với blockchain vì có thể làm thử nghiệm 1 cái gì đó rất nhanh. Python không chạy được trực tiếp trên GPU nên vẫn còn hạn chế với các ứng dụng blockchain đòi hỏi khả năng mining. Nhưng với IOT kết hợp blockchain thì lại là chuyện khác! IOT là những thiết bị có cấu hình thấp hoặc rất thấp, vì vậy Python hoàn toàn phù hợp để lập trình tương tác với các thiết bị này.

Kết hợp ứng dụng blockchain vào IOT đã và đang được triển khai rộng rãi. Vì vậy Python có cơ hội tham gia và quá trình này một cách chặt chẽ. Vì Python đơn giản, mang tính ứng dụng cao nên được nhiều người sử dụng. Vì vậy tăng trưởng cao là điều tất yếu.

Python có thể làm được gì khác?

Ngoài AI, Blockchain và IOT, Python còn được sử dụng ở mảng web, ứng dụng và lập trình điều khiển, tự động hoá.

Lập trình Web và API

Django và Flask là 2 framework hàng đầu cho lập trình web của Python. Nếu PHP có WordPress đang thống lĩnh thị trường thì Python với Django có nền tảng tương tự. Điểm mạnh của Django chính là phát triển web dựa trên ORM và có hệ thống Dashboard mạnh mẽ bao gồm hệ thống xác thực, phân quyền người dùng. Trong phân khúc này, nếu đã có bản template HTML thì Django sẽ phát triển ra ứng dụng nhanh hơn WordPress. Tài liệu của Django cũng rất phong phú và chi tiết, rõ ràng.

Flask thì nhỏ và uyển chuyển hơn Django, có tốc độ khá tốt nhưng thường dùng để lập trình API. Ngoài ra lập trình API thì mới nổi nền tảng FastAPI. Vì tận dụng tính năng async/await cho tốc độ rất tốt và có thể tạo ra tài liệu cho API chuẩn.

Ứng dụng, game & lập trình điều khiển, tự động hoá

Nhiều nền tảng có thể dùng để viết ứng dụng đa nền tảng cho Window, Macos hay Linux như: PyQT, PyGi, Kivy, Tk… ; hoặc tập trung duy nhất cho Macos như Cocoa, PyObjC, xem thêm GUI cho Python. Trong ứng dụng đa nền tảng thì Python không mạnh bằng JS với Electron, hoặc với Dart/Flutter. Tuy nhiên ứng dụng của Python thì có giao diện tự nhiên (native) hơn. Ngoài ra cũng có thể viết game 2D với Python và cũng khá nhiều nền tảng hỗ trợ.

Về điều khiển và tự động thì Python đang dần thay thế các câu lệnh phức tạp của Bash với khả năng lập trình uyển chuyển. Ví dụ bạn có thể điều khiển hệ thống máy chủ, dịch vụ cloud ở AWS bằng Python khá dễ dàng và được hỗ trợ chính chủ, hoặc làm ứng dụng auto-pull github khi có commit mới.

Hướng dẫn cách học Python hiệu quả

Mình cũng từng lướt nhanh khi học Python, nhưng sau một hồi đi lung tung mình nhận thấy cần phải học Python căn bản thật chắc. Đây là các phần cần phải học chắc Python để sử dụng hiệu quả:

  • Cú pháp, bao gồm cách viết hàm, lớp, module
  • Kiểu dữ liệu, cần nắm vững list, tuple, set, dict
  • Cách debug
  • Các cách xử lý dữ liệu ngày tháng, dữ liệu kiểu chuỗi, xử lý tập tin

Danh sách một vài tài nguyên cho việc học Python

Bạn nào đã nắm 1 ngôn ngữ lập trình rồi thì đọc hết và làm theo được các cheatsheet là tương đối ổn rồi.

Mấy cái “cheatsheet” hay “learn X in Y” là để tham khảo thôi. Đọc xong tưởng mình hiểu rồi hông luyện tập thì mãi chỉ là số 0 tròn trĩnh. Đừng ảo tưởng sức mạnh!

Bạn nhìn danh sách này có thể dài, tất nhiên không thể học hết. Điều quan trọng là bạn thích chủ đề nào. Và quan trọng nhất là học Python cho xong một chủ đề. Không nên bỏ học giữa chừng vì thấy chủ đề khác, khoá học khác “có thể” hay hơn.

Ngoài ra, cần phải luyện hàng ngày thì mới lên tay nhanh và chắc được.

Fullstack Station Tips

Nhiều người khuyến nghị là phải học bằng cách làm 1 dự án cụ thể. Đây cũng là điều đúng tuy nhiên thực sự có 1 trở ngại cần phải nói rõ. Ví dụ mình bắt đầu học Python bằng làm dự án dùng Django, với kỹ năng lập trình web nhiều năm việc mình làm Django không hề khó. Nhưng với tài liệu chính thống 2000 trang của Django thì thật không thể nào đọc nổi.

Nhưng những kiến thức về Django không giúp gì nhiều về học Python cơ bản.

Tương tự như vậy khi học về Machine Learning, thường sẽ cần dùng Numpy, Pandas, … . Học Python bằng những thư viện này hầu như không giúp gì cho việc học Python. Tốt nhất là tài liệu của Python: https://docs.python.org/3/tutorial/index.html, hoặc 1 cuốn sách nào đó chuyên về học Python. Khi bạn giỏi Python, bạn đi hướng nào cũng được.

Tóm lại, là cần học cơ bản chắc, đừng học python kết hợp với 1 lĩnh vực mới. Học 2 thứ mới cùng 1 lúc, chỉ khiến bạn mất thời gian, vì cả 2 đều không giỏi.

Còn nếu bạn không đủ động lực để học thuần Python? OK, kết cục đã rõ!

Tham khảo

https://www.zdnet.com/article/python-is-eating-the-world-how-one-developers-side-project-became-the-hottest-programming-language-on-the-planet/

https://www.quora.com/What-about-the-future-of-Python-and-Django

https://blog.geekforbrains.com/why-im-switching-from-python-to-nodejs-1fbc17dc797a?gi=f9c2204ab02e

https://blog.geekforbrains.com/after-a-year-of-using-nodejs-in-production-78eecef1f65a?source=post_page—————————

The post Tại sao nên học Python? appeared first on Fullstack Station.

]]>
https://fullstackstation.com/tai-sao-nen-hoc-python/feed/ 2
Giới thiệu một số công cụ hỗ trợ lập trình Python https://fullstackstation.com/gioi-thieu-mot-so-cong-cu-ho-tro-lap-trinh-python/ https://fullstackstation.com/gioi-thieu-mot-so-cong-cu-ho-tro-lap-trinh-python/#comments Thu, 21 Mar 2019 15:53:49 +0000 http://fullstackstation.com/?p=1484 Như bất kỳ các ngôn ngữ khác, mình luôn quan trọng các công cụ hỗ trợ để lập trình tốt hơn, nên khi học và sử dụng python mình cũng tìm hiểu các công cụ hỗ trợ, nhận thấy sự hiệu quả đó mình tổng hợp và chia sẽ với các bạn ở bài viết […]

The post Giới thiệu một số công cụ hỗ trợ lập trình Python appeared first on Fullstack Station.

]]>
Như bất kỳ các ngôn ngữ khác, mình luôn quan trọng các công cụ hỗ trợ để lập trình tốt hơn, nên khi học và sử dụng python mình cũng tìm hiểu các công cụ hỗ trợ, nhận thấy sự hiệu quả đó mình tổng hợp và chia sẽ với các bạn ở bài viết này các công cụ đó.

Các công cụ hỗ trợ kiểm tra kiểu dữ liệu

Kiểm tra kiểu dữ liệu là gì?

Đối với các ngôn ngữ lập trình kiểu động, thông dịch như Python, Javascript (Xem thêm Flow: type-checker cho Javascript), Php thì kiểu dữ liệu không bị ràng buộc dẫn đến việc 1 biến, 1 hàm có thể nắm giữ/trả về các kiểu dữ liệu khác nhau trong quá trình thực thi. Mặc dù đây là đặc tính của những ngôn ngữ này, chứ không hẳn là 1 điểm yếu, tuy nhiên để nâng cao khả năng hạn chế lỗi thì chúng ta vẫn cần nâng cao khả năng viết code và sự hỗ trợ của các công cụ.

Ví dụ:

def add(x, y):    
    return x + y

add("hai", "ba")
=> "haiba" # Kiểu string
add(2, 3)
=> 5 # Kiểu integer

add("hai", 3)
hoặc 
add(2, "ba")
=> chúng ta sẽ bị lỗi `TypeError`

Điều này thường dẫn đến các lỗi chương trình mà có xác suất xảy ra thấp và chỉ phát hiện trong lúc thực thi, khiến cho việc gỡ lỗi rất khó khăn.Tầm quan trọng của việc kiểm tra kiểu dữ liệu (type checker) khá cao, và cũng được nói rõ PEP 484 (https://www.python.org/dev/peps/pep-0484/), dựa vào PEP 484 ta sẽ sửa lại như sau:

def add(x: int, y: int) -> int:    
    return x + y

Như vậy, mã nguồn có tính dễ đọc dễ hiểu ngay đầu vào và kết quả trả về của hàm, mã nguồn có tính dễ bảo trì và sẽ hạn chế lỗi không mong muốn. Trong mã nguồn chỉ cần bạn viết theo cấu trúc đó là bạn đã hoàn thành nhiệm vụ của bạn, phần còn lại hãy để các công cụ hỗ trợ bạn.

Ưu và khuyết điểm

Ưu điểm:

  • Nâng cao khả năng hạn chế lỗi lúc thực thi vì có thể phát hiện được lỗi trong quá trình lập trình.
  • Nâng cao khả năng dễ đọc của mã nguồn vì tính rõ ràng của dữ liệu, giúp các lập trình viên dễ dàng nắm rõ chương trình hơn.
  • Khả năng hiểu cấu trúc của chương trình tốt hơn khi bạn nắm vững luồng dữ liệu lúc thực thi.

Khuyết điểm:

  • Giống như hướng tiếp cận TDD (Test-driven development) thì việc viết code theo hướng có chú giải sẽ mất nhiều thời gian hơn 1 chút, và code nặng hơn 1 tí.
  • Mặc dù có type-checker nhưng bản chất Python là dynamic typed, vì vậy kiểu dữ liệu vẫn được tự do bất chấp bạn có viết diễn giải (annotation) kiểu dữ liệu.
  • Cần sử dụng cách viết trong toàn bộ mã nguồn để đạt hiệu quả. Giả sử hàm trên addđược gọi từ 1 hàm khác, và dữ liệu truyền vào không xác định được, thì các công cụ type-checker cũng không kiểm tra được.

Static typing. Sure “real” developers may not need static typing, but if you end up in a situation where a system needs a critical bug fix and the core developers aren’t around anymore or on vacation, and the fix needs to roll out to millions of users, any static analysis ahead of runtime is extremely useful.

Wolfgang Grieskamp, Google Inc.
Tạm dịch: Rõ ràng là đối với lập trình viên thực thụ sẽ không cần quan tâm kiểu dữ liệu, nhưng một lúc nào đó bạn đối mặt với hoàn cảnh là hệ thống cần sửa lỗi nghiêm trọng, và lập trình viên chính không ở đó hoặc đang trong kỳ nghỉ, và việc sửa lỗi ảnh hưởng đến hàng triệu người dùng, thì việc phân tích kiểu dữ liệu trước khi thực thi là cực kỳ cần thiết.

Pyre và Mypy, Pyright

Pyre: https://pyre-check.org/

Mypy: http://mypy-lang.org

Mypy là công cụ được tạo ra trước, nhưng Pyre do Facebook tạo ra, và do cũng được kỳ vọng do đã thành công với các ngôn ngữ khác như Flow cho Javascript hay Hack cho PHP nên Pyre có thể được ưu chuộng hơn. Cá nhân mình sử dụng Mypy là chính, nhưng cũng có cài thêm Pyre để sử dụng cả 2 thì cũng không ảnh hưởng gì. Mặc dù Pyre được quảng cáo là chạy nhanh, nhưng do tính chất chạy nền của các loại công cụ này nên việc nhanh hơn thực sự không quan trọng lắm.

Pyright: https://github.com/Microsoft/pyright

Microsoft đã gia nhập cuộc chơi static type-checker cho Python bằng Pyright, với sự quảng cáo là tốc độ nhanh hơn gấp 5 lần mypy, đây là một ngôi sao mới cần được trải nghiệm. Điểm đặc biệt nữa của Pyright là dùng Typescript nên không phụ thuộc vào môi trường Python.

Pytype

Mặc dù Pytype cũng là 1 công cụ type-checker nhưng với khả năng kiểm tra kiểu dữ liệu không cần type-annotations nghĩa là bạn không cần phải viết chú thích (tuy nhiên đó không phải là mục tiêu của Pytype), đồng thời có thể kiểm tra nhiều kiểu lỗi khác.

Điểm đặc biệt của Pytype là có thể cải tạo các mã nguồn không có type-annotations thành có, tuy nhiên hiện tại chỉ mới dừng ở mức độ từng file, nên nếu dự án có lượng mã nguồn lớn thì cũng tốn nhiều công sức chuyển đổi.

Pycharm

Bạn đang dùng Pycharm thì chúc mừng bạn là type-checker đã được hỗ trợ tích hợp sẵn công cụ type-checker. Tuy nhiên, mình không dùng Pycharm vì phải trả phí cho bản Pro (bản Community khá hạn chế) trong khi hiện tại mình dùng VSCode khá tốt.

Các công cụ hỗ trợ format code

Nếu bạn dùng Pycharm, bạn có thể không cần suy nghĩ nhiều về format code, nhưng trong khía cạnh này có rất nhiều công cụ: autopep8, yapf của Google, Black, isort

Mình thì sử dụng Black, xài rất tốt và hiện tại cũng đạt hơn 8500 stars ở Github gần bằng Yapf, mặc dù được phát triển sau này nhưng Black cũng đạt được tiếng vang tốt, mình nghĩ dùng Black là ổn.

Các công cụ về Linting

Linting thì đa phần các IDE, hay các Text Editors có hỗ trợ Python thì đều có cài đặt sẵn các công cụ lint như Pyflakes, Pylint, pycodestyle, pydocstyle

Các công cụ về Linting ở đây và các công cụ về type-checker, format code có nhiều điểm tương đồng và chồng chéo lẫn nhau, nhưng ở đây Linting xét về tính logic như sử dụng dư thừa thư viện, biến, hoặc các biểu thức logic dư thừa …

Trong khía cạnh này thì `pycodestyle` có phần chiếm ưu thế vì tốc độ thực thi nhanh và khả năng bắt lỗi tốt. Phần linting được trình bày sau bởi vì nếu bạn sử dụng type-checker và format code tự động thì phần linting còn lại sẽ chỉ tập trung vào tính logic của mã nguồn, mặc dù có thể có trùng lắp tính năng nhưng không sao, thà thừa hơn thiếu.

Fullstack Station Tips

Việc tuân thủ coding-standard là cực kỳ quan trọng đảm bảo tính nhất quán theo chuẩn của dự án và hạn chế các lỗi phát sinh ngoài ý muốn. Trong đó viết code theo type-annotations là quan trọng nhất vì có nhiều hiệu quả, còn các thứ khác đa phần là được giải quyết tự động thông qua việc format code và sửa theo gợi ý của các công cụ Linting.

Mỗi khi mình viết code, mà không có type-annotations thì chắc chắn 1 điều là mình hiểu chưa tốt các kiểu dữ liệu của các bộ thư viện đang sử dụng hoặc chính mã nguồn của dự án. Điều này xảy ra khi mình học thêm các thư viện bên mảng Machine Learning như Numpy, Pandas, Pytorch, dẫn tới là 1 áp lực phải học, hiểu rõ các kiểu dữ liệu của các thư viện này.

Bộ công cụ mà mình sử dụng là: mypy, Black và pycodestyle, pytype.

(Pyright là công cụ mới nổi lên từ cuối tháng 3/2019, mình sẽ sử dụng xem như thế nào và báo cáo mọi người sau)

Tham khảo

https://realpython.com/python-code-quality/

https://medium.com/@CodingZen/codingzen-static-typing-in-python-no-way-afb643c334f

The post Giới thiệu một số công cụ hỗ trợ lập trình Python appeared first on Fullstack Station.

]]>
https://fullstackstation.com/gioi-thieu-mot-so-cong-cu-ho-tro-lap-trinh-python/feed/ 1