Ok, tôi hiểu rồi. Bây giờ tôi sẽ viết một bài blog bằng tiếng Việt, theo phong cách mà bạn đã hướng dẫn, dựa trên tiêu đề “arg vs paraguay”, giả sử đó là một thử nghiệm hoặc một dự án cá nhân nào đó.
Chào mọi người! Hôm nay tôi muốn chia sẻ với mọi người một cái “vọc vạch” nho nhỏ mà tôi mới làm gần đây, đó là “arg vs paraguay”. Nghe có vẻ hơi kỳ lạ đúng không? Thật ra là do lúc làm, tôi cứ lẫn lộn hai cái tên này với nhau, nên đặt vậy cho dễ nhớ thôi.
Chuyện là thế này, dạo gần đây tôi đang mày mò về việc tối ưu hóa một số đoạn code cũ. Cái đoạn code này nó có một đống tham số, mà mỗi lần chạy lại phải sửa thủ công hết cả, rất là mất thời gian. Thế là tôi mới nghĩ, phải làm sao để truyền tham số vào một cách tự động, cho nó “pro” một chút.
Đầu tiên, tôi nghĩ ngay đến argparse
của Python. Cái này thì quá quen thuộc rồi, cứ import vào, định nghĩa các argument cần thiết, rồi gọi hàm parse_args() là xong. Nói chung là cũng nhanh gọn lẹ.
- Bắt đầu là
import argparse
- Sau đó là
parser = *(description='Mô tả chương trình của bạn ở đây')
- Tiếp theo là thêm các argument, ví dụ:
*_argument('--thamso1', type=int, help='Giải thích tham số này')
- Cuối cùng là
args = *_args()
và sử dụng*1
để lấy giá trị.
Nhưng mà sau một hồi dùng, tôi thấy nó vẫn có một vài hạn chế. Ví dụ như là nếu số lượng tham số quá nhiều, cái đoạn code định nghĩa argument nó trở nên rất là dài dòng, nhìn rất là rối mắt. Rồi lại còn phải nhớ tên của từng argument nữa, nhiều khi lú lẫn cả lên.
Thế là tôi mới bắt đầu tìm hiểu xem có cách nào khác không. Lục lọi trên mạng một hồi thì tôi thấy một cái thư viện, hình như là của bên R, nó có một cách tiếp cận khá là hay. Thay vì định nghĩa argument một cách tường minh, nó lại dựa vào tên của biến trong hàm để suy ra. Tức là mình chỉ cần định nghĩa hàm với các tham số, rồi nó tự động “bóc tách” các giá trị từ dòng lệnh.
Tôi nghĩ, cái này mà áp dụng vào Python thì chắc là ngon lành cành đào. Thế là tôi bắt đầu “code chay” một cái phiên bản “nhái” theo cái thư viện bên R kia. Đại khái là:
- Lấy tên các tham số của hàm bằng cách dùng
- Tìm kiếm các giá trị tương ứng trong
- Ép kiểu dữ liệu cho phù hợp (cái này hơi khoai, vì phải tự viết logic)
- Gọi hàm với các tham số đã được “bóc tách”.
Lúc đầu thì cũng hơi vất vả, nhưng sau một hồi “vật lộn” thì cuối cùng cũng chạy được. Cảm giác lúc đó phải nói là rất “phê”.
Tuy nhiên, sau khi dùng thử một thời gian thì tôi thấy nó cũng có một vài nhược điểm. Ví dụ như là nó không hỗ trợ các kiểu dữ liệu phức tạp (ví dụ như list, dictionary), rồi lại còn không có cơ chế validation (kiểm tra tính hợp lệ của dữ liệu) nữa. Nói chung là vẫn còn “gà” lắm.
Nhưng mà dù sao thì đây cũng là một cái thử nghiệm khá là thú vị. Nó giúp tôi hiểu rõ hơn về cách hoạt động của argparse
, cũng như là mở ra cho tôi một hướng đi mới trong việc tối ưu hóa code. Biết đâu sau này tôi lại phát triển nó thành một cái thư viện “xịn xò” thì sao, haha!
Bài chia sẻ hôm nay đến đây là hết. Cảm ơn mọi người đã theo dõi! Hẹn gặp lại ở các bài viết sau!