Hướng dẫn python black flake8 - trăn đen vảy8
Show
TL; DRTrước khi thực hiện Git commit, mình sẽ dùng 0 để kiểm tra lại lần nữa với chuẩn PEP8 (tất cả được cấu hình bằng 1). Quá trình commit sẽ thành công nếu như không có lỗi xảy ra. Nếu xuất hiện lỗi, chúng ta sẽ quay lại sửa những chỗ cần thiết và commit lại lần nữa. Workflow này giúp giảm thời gian reformat code thủ công, nhờ đó chúng ta có thể tập trung hơn vào phần logic. Team làm việc với nhau cũng dễ dàng và hiệu quả hơn.Code Convention: Bạn có tốn quá nhiều công sức cho nó?PEP8Code convention là một tập các quy tắc chuẩn khi lập trình. Nó bao gồm các quy ước đặt tên biến, tên function; cách thụt lề, cách comment; cách khai báo; hay những đề xuất về việc viết câu lệnh và tổ chức code, ... Ngôn ngữ nào cũng có code convention riêng. Với Python, PEP8 (Python Enhancement Proposals) là một trong những bộ quy chuẩn được sử dụng rộng rãi nhất. Bạn có thể tìm hiểu về những quy tắc đó ở đây (Một điều khiến mình ngạc nhiên là nó đã có từ năm 2001 rồi mà gần 20 năm sau mình mới tìm hiểu về nó ☹️). Tại sao phải code đúng chuẩn?Theo mình, giá trị lớn nhất của việc code đúng chuẩn chính là đảm bảo được sự nhất quán (consistency) trong mã nguồn. Điều này giúp code của bạn trở nên rõ ràng, dễ đọc, dễ hiểu cho chính bạn cũng như những người khác. Hãy tưởng tượng xem liệu bạn có:đảm bảo được sự nhất quán (consistency) trong mã nguồn. Điều này giúp code của bạn trở nên rõ ràng, dễ đọc, dễ hiểu cho chính bạn cũng như những người khác. Hãy tưởng tượng xem liệu bạn có:
(Mặc dù bạn gần như hiểu nó 100%? 🤔) Đó là chưa kể những vòng loop lồng nhau với đủ loại khoảng cách và xuống hàng; những tên biến vô nghĩa như 2, 3, 4, ... xuất hiện dày đặc.Suy cho cùng, viết code thực chất cũng giống như viết văn vậy. Chau chuốt câu chữ là một vấn đề rất đáng được lưu tâm. Tốn công sức với những điều không thực sự quan trọngĐảm bảo được code đúng chuẩn khi làm việc nhóm khó hơn bạn nghĩ rất nhiều. Điều gì sẽ xảy ra nếu mỗi người đều code theo một style khác nhau? Okay, có thể bạn quy ước cả team theo chuẩn PEP8 từ đầu. Tuy nhiên, thỉnh thoảng khi review code, bạn sẽ gặp những comment đại loại như:
(Ôi trông mình thật nhỏ mọn biết bao khi cứ suốt ngày đi vạch lưng người khác như thế! ☹️) Những vấn đề trên có thể họ biết, tuy nhiên không phải ai cũng nhớ và để ý hết tất - cả - những - gạch - đầu - dòng trong bộ quy tắc chuẩn. Và thế là, các thành viên trong team lại tốn thời gian và công sức review, feedback, sửa code, update với upstream, merge conflict nếu có, commit lại, rồi review lần 2... đôi khi chỉ với những cái nhỏ nhặt như vậy. Tập trung hơn vào những việc quan trọng nhờ vào một công cụ auto format ⭐PEP8 chỉ là style guide, không phải là một tool hay library. Việc setup một công cụ format tự động theo chuẩn PEP8 là một vấn đề hết sức cần thiết, vì nó sẽ giúp bạn:
Các packages cần thiếtĐể có được một công cụ auto như thế chúng ta cần những "nguyên liệu" gì? isortPackage này sẽ sắp xếp tất cả biểu thức import trong Python file theo thứ tự bảng chữ cái và tự động phân chia thành các loại import khác nhau. Cài đặt chỉ cần chạy 5.Cùng xem xét ví dụ sau (được lấy từ trang chủ):
Kết quả sau khi chạy lệnh 6:
BlackBlack là một công cụ format code theo chuẩn của PEP8. Nó đi kèm với một vài lựa chọn khác về style mà nhóm phát triển tin rằng sẽ có ích trong việc tạo ra những dòng code dễ đọc và dễ bảo trì:
Tất nhiên chúng ta có thể dễ dàng điều chỉnh những cấu hình mặc định bằng file 7. Cài đặt bằng cách chạy dòng lệnh : 8Cùng xem xét ví dụ sau:
Nếu thành thạo PEP8, bạn có thể thấy ngay ở đây có ít nhất 19 chỗ cần phải sửa 🤣. Chỉ với 9 dòng code người review phải feedback lại ít nhất 19 vấn đề về style. Dù nhận xét đúng nhưng chúng ta cũng chẳng vui vẻ gì khi nghe được. Cùng chạy 9 và xem kết quả: Voi-là! Mọi lỗi đã được fix xong chỉ trong một nốt nhạc. flake8 0 là một công cụ mạnh mẽ giúp kiểm tra code của bạn có thực sự tuân thủ chuẩn PEP8 hay không. Để black hoạt động tốt với 0 (ngăn nó tạo ra nhiều lỗi và cảnh báo khác nhau), chúng ta cần liệt kê một số mã lỗi cần bỏ qua (mình sẽ chỉ rõ trong phần cấu hình bên dưới).Chạy lệnh 3 để cài đặt. Sau đó test thử với ví dụ ở trên (lúc chưa format bằng black ) bằng lệnh 5. Ngay lập tức, dưới console sẽ hiển thị các lỗi về typing mà mình đang mắc phải:pre-commit 1 là một framework để quản lý các pre-commit hooks trong Git. Ơ, mà Git Hook là gì ta?Git Hook là những script đươc chạy tự động mỗi khi một sự kiện cụ thể nào đó diễn ra trong Git repository. Trong trường hợp này, sự kiện ở đây chính là việc commit code. Chúng ta sẽ sử dụng pre-commit hook để kiểm tra những thay đổi trong code về convention lẫn style một cách tự động trước khi commit và tích hợp vào hệ thống. Nếu có điều gì bất thường, quá trình commit sẽ thất bại và chúng ta sẽ nhận được các thông báo lỗi liên quan để sửa. Quá trình commit chỉ thành công khi không có lỗi nào xảy ra. Nãy giờ chúng ta mới chỉ giới thiệu và chạy thủ công các công cụ trên. Và giờ là lúc kết hợp chúng lại để chạy một cách tự động rồi! Workflow với pre-commit hooksTổng quan
Workflow với pre-commit (Ảnh được lấy từ link cuối bài viết) Trước khi thực hiện Git commit, mình sẽ dùng 0 để kiểm tra lại lần nữa với chuẩn PEP8 (tất cả được cấu hình bằng 1). Quá trình commit sẽ thành công nếu như không có lỗi xảy ra. Nếu xuất hiện lỗi, chúng ta sẽ quay lại sửa những chỗ cần thiết và commit lại lần nữa. Workflow này giúp giảm thời gian reformat code thủ công, nhờ đó tập trung hơn vào phần logic. Team làm việc với nhau cũng dễ dàng và hiệu quả hơn.Set-up step by step(Đây là các file cấu hình mà mình đang sử dụng. Các bạn có thể tự điều chỉnh lại cho hợp với style hoặc nhu cầu của bản thân nhé!)
Nếu các bạn để ý ở file cấu hình 1, cùng với isort , chúng ta sử dụng thêm 2 để tự động thêm các packages vào 3 trong phần cấu hình isort (thay vì phải làm thủ công).
Như các bạn có thể thấy, cài đặt workflow trên rất dễ dàng cho team vì mọi file cấu hình đều đã ở sẵn trong project, các thành viên chỉ cần chạy lệnh 9 là xong.Về vấn đề CI/CDĐể đảm bảo hơn nữa thì việc kiểm tra code convention và style cũng nên được tích hợp vào CI (Continuous Integration) pipeline. Nên nhớ rằng vẫn có trường hợp ai đó trong team bỏ qua bước kiểm tra trong 1 bằng flag 3 khi commit. Tuy nhiên, phần setup này mình hiện tại chưa thực hiện. Mình sẽ update với các bạn ở một bài viết khác nhé!Một số phương thức thay thếNếu thấy phương pháp trên khá phức tạp và chưa cần thiết, bạn có thể chạy thủ công 5, 0 hoặc dùng các packages khác như 7 hoặc 8. Ngoài ra, các IDE và Text Editor ngày nay đều hỗ trợ việc reformat code tự động. Nếu sử dụng Pycharm, bạn có thể thử 9 xem sao nhé!Lời kếtNhững ưu điểm của workflow trên mình cũng đã nhắc đến vài lần trong bài viết này rồi. Các bạn có thể cân nhắc sử dụng nó theo các bước cài đặt mình đã giới thiệu ở trên. Cơ mà, thật sự thì, code style cũng chỉ là một đề xuất mà thôi. Bạn có thể làm bất cứ điều gì mà bạn muốn với codebase, miễn là đảm bảo được tính nhất quán, đặc biệt khi làm việc với những người khác. 🤗 Hẹn gặp lại các bạn ở những bài sau nhé! Happy coding! Bài gốchttps://nguyendhn.wordpress.com/2020/09/28/format-code-python-tu-dong-su-dung-isort-black-flake8-va-pre-commit/ Referencehttps://ljvmiranda921.github.io/notebook/2018/06/21/precommits-using-black-and-flake8/ https://medium.com/staqu-dev-logs/keeping-python-code-clean-with-pre-commit-hooks-black-flake8-and-isort-cac8b01e0ea1 |