Giới thiệu

Chắc hẳn trong chúng ta, ai cũng đã từng ít nhất một lần làm việc trên giao diện console (terminal). Và việc sử dụng một lệnh nào đó đều có các tùy chọn rất là phong phú. Ví dụ như lệnh cp (copy) trên Linux. Khi bạn truyền tham số --help hoặc man cp sẽ nhận được hướng dẫn đầy đủ với rất nhiều tùy chọn khác nhau.

Có bao giờ bạn tự thắc mắc rằng nó nhận và xử lý các tham số (tùy chọn) đấy như thế nào không? Chúng ta cùng đi tìm hiểu nhé!

Python, để nhận tham số ta sử dụng module optparse, nhưng nó đã ngừng hỗ trợ ở python 3.2, nếu bạn sử dụng bản cao hơn thì argparse là phiên bản thay thế. Bài viết này mình sẽ giới thiệu về argparse nhé!

Bắt đầu

Argparse có sẵn trong Python 2.7 trở lên nên bạn không cần cài đặt. Để sử dụng, bạn chỉ cần import nó và khởi tạo class ArgumentParser là có thể sử dụng được.

import argparse

parser = argparse.ArgumentParser(description="Mô tả chương trình ở đây")
args = parser.parse_args();

Ở đây, chúng ta đang tạo ra 1 biến là parser. phần ArgumentParser sẽ trả về một đối tượng. Từ bước này trở đi biến parser sẽ lưu giữ các thông tin cần thiết để xử lý tham số. description sẽ cho mô tả về chương trình của bạn (không bắt buộc). Còn parse_args() sẽ convert các tham số nhận được thành một object và gán nó thành một thuộc tính của namespace (điều này là bắt buộc ở mọi chương trình).

Bây giờ bạn có thể chạy với tham số –help hoặc -h để xem trợ giúp tham số.

Nếu muốn khi chạy mà không truyền đối số cũng in ra hướng dẫn (dành cho bắt buộc truyền đối số), bạn thêm đoạn code sau:

if __name__ == "__main__":
    parser.print_help()

Cấu trúc

Vậy là bạn đã có cái nhìn đầu tiên về Argparse rồi. Chúng ta sẽ tìm hiểu tiếp xem constructor của class ArgumentParser có những tham số nào nhé.

  • prog: Tên của chương trình. Nếu không có, mặc định nó sẽ lấy từ sys.argv[0] – tên file
  • usage: Đoạn văn bản để mô tả cách sử dụng hay giới thiệu chương trình.
  • description: Text sẽ được hiển thị trước nội dung trợ giúp
  • epilog: Text sẽ được hiển thị sau khi kết thúc hết phần nội dung trợ giúp
  • parents: Mảng object của ArgumentParser khác.
  • formatter_class: Tên class mà bạn muốn sử dụng để hiển thị nội dung trợ giúp.
  • prefix_chars: Tập hợp các ký tự mà bạn muốn sử dụng trước những tham số tùy chọn. Mặc định là dấu -
  • fromfile_prefix_chars: Tập hợp các ký tự mà bạn muốn sử dụng trước các tham số liên quan đến đường dẫn của file. Mặc định là None
  • argument_default: Giá trị mặc định cho các tham số. Mặc định là None
  • conflict_handler: Giúp bạn xử lý trong trường hợp bạn thêm một tham số nào đó nhiều hơn 1 lần. Tham số này nhận giá trị là resolve
  • add_help: Tự thêm tham số -h/–help vào chương trình của bạn. Mặc định là True
  • allow_abbrev: Cho phép viết tắt các tùy chọn nào đó quá dài (nếu có thể và từ viết tắt phải rõ ràng). Ví dụ bạn có option là –no-download thì người dùng có thể sử dụng –n hoặc –no. Giá trị mặc định là True

Trên là sơ qua về constructor trong class ArgumentParser. Bây giờ chúng ta tìm hiểu một số method của class này nhé.

Thêm tham số

Định nghĩa một tham số nào đó mà chương trình của bạn cần parse.

  • name or flag: Tên hoặc ký hiệu của tùy chọn đó. Ví dụ: foo-f hoặc –foo
  • action: Tên của hành động sẽ được thực hiện khi tham số đó được nhập. Chúng ta có những action cơ bản sau:
    • store: Lưu lại giá trị người dùng đã nhập vào name or flag. Mặc định
    • store_const: Lưu giá trị nhận được vào const
    • store_true và store_false: Một trường hợp đặc biệt của store_const giúp bạn lưu giá trị boolean vào name or flag.
    • append: Các giá trị sẽ được lưu ở 1 list. Giá trị mới sẽ được thêm vào cuối list đó.
    • append_const: Giống với append nhưng áp dụng cho const.
    • count: Đếm số lần xuất hiện của tham số đó.
    • help: Action này để hiển thị nội dung trợ giúp giống khi dùng -h/–help
    • version: Giúp bạn hiển thị phiên bản của chương trình. Action này cần đi cùng với tham số version.
  • nargs: Số lượng tham số mà bạn cần. Giá trị mặc định là 1.
  • const: Giá trị không đổi cho một vài action hay nargs
  • default: Giá trị mặc định cho tùy chọn nếu như tùy chọn đó không được chọn
  • type: Kiểu của giá trị. Ví dụ: float hoặc int
  • choices: Mảng các lựa chọn cố định cho tham số đó.
  • required: Tham số này có bắt buộc phải nhập không.
  • help: Nội dung mô tả cho tham số này.
  • metavar: Tên của tham số được sử dụng trong phần nội dung mô tả cho tham số.
  • dest: Tên biến nhận được giá trị của tham số.

Ví dụ

import argparse

parser = argparse.ArgumentParser(description="Mô tả chương trình ở đây")

parser.add_argument("-f", "--file", metavar="FILE", dest="filename",
                    help="write output to a file" )
parser.add_argument("-q", "--quiet", dest="noprint",
                    action="store_false", default=True,
                    help="do not print the results to console")

args = parser.parse_args();

if __name__ == "__main__":
    parser.print_help()

Ở đây ta có thể dễ hiểu là khi dùng -f hoặc –file sẽ là lấy tên file còn -q hoặc –quiet là không xuất output.

  • metavar là nội dung đại diện cho giá trị xử lý
  • dest là tên biến trong chương trình sẽ nhận giá trị vào
  • help là nội dung in ra khi -h/–help
  • action=”store_false”, default=True là nếu không nhập thì giá trị là true, còn khi gọi sẽ lưu là false

Bây giờ bạn có thấy càng ngày chương trình càng giống những chương trình Python bạn hay gặp trên Github chưa?

Như vậy là đã đủ để bạn có thể tự thử rồi. Bạn có thể đọc thêm tài liệu tại trang chủ Python để biết thêm thông tin về module.

Lưu ý: args sẽ là class lưu trữ các giá trị nhận vào, ta có thể truy cập các giá trị qua args.dest

Ví dụ

Bạn có thể xem qua ví dụ này để hiểu kĩ hơn nhé.

import argparse

parser = argparse.ArgumentParser(description="Mô tả chương trình")

parser.add_argument("-n", metavar="NUMBER", dest="number",
                    help="input number", type=int)
parser.add_argument("-t", metavar="TEXT", dest="message",
                    help="input text", type=str)

args = parser.parse_args();

print("number = ", args.number)

print("message = ", args.message)

Leave a Reply

This site uses cookies to offer you a better browsing experience. By browsing this website, you agree to our use of cookies.