[MẸO] Trình phân tích đối số Python - Những thực hành xấu

By khoanc, at: 11:28 Ngày 18 tháng 10 năm 2024

Thời gian đọc ước tính: __READING_TIME__ minutes

[TIPS] Python Argument Parser - Bad Practices
[TIPS] Python Argument Parser - Bad Practices

1. Sử dụng sys.argv Trực tiếp

 

import sys

def main():
    if len(sys.argv) < 3:
        print("Không đủ đối số!")
        return
    
    arg1 = sys.argv[1]
    arg2 = sys.argv[2]
    
    if arg1 == 'option1':
        print(f"Đã chọn Option 1 với giá trị {arg2}")
    elif arg1 == 'option2':
        print(f"Đã chọn Option 2 với giá trị {arg2}")
    else:
        print("Option không xác định!")

if __name__ == "__main__":
    main()


Thực hành xấu: Sử dụng sys.argv trực tiếp để phân tích đối số có thể dễ dẫn đến lỗi và khó bảo trì.

 

Khắc phục: Sử dụng module argparse để phân tích đối số. Nó cung cấp cách xử lý đối số dòng lệnh mạnh mẽ và thân thiện với người dùng hơn.

 

import argparse

def main():
    parser = argparse.ArgumentParser(description="Một trình phân tích đối số mẫu.")
    parser.add_argument('arg1', type=str, help="Đối số đầu tiên")
    parser.add_argument('arg2', type=str, help="Đối số thứ hai")
    args = parser.parse_args()
    
    if args.arg1 == 'option1':
        print(f"Đã chọn Option 1 với giá trị {args.arg2}")
    elif args.arg1 == 'option2':
        print(f"Đã chọn Option 2 với giá trị {args.arg2}")
    else:
        print("Option không xác định!")

if __name__ == "__main__":
    main()

 

2. Không có Thông báo Sử dụng hoặc Trợ giúp

 

import sys

def main():
    if len(sys.argv) < 3:
        print("Không đủ đối số!")
        return
    
    arg1 = sys.argv[1]
    arg2 = sys.argv[2]
    
    if arg1 == 'option1':
        print(f"Đã chọn Option 1 với giá trị {arg2}")
    elif arg1 == 'option2':
        print(f"Đã chọn Option 2 với giá trị {arg2}")
    else:
        print("Option không xác định!")

if __name__ == "__main__":
    main()


Thực hành xấu: Không cung cấp thông báo sử dụng hoặc trợ giúp khiến người dùng khó hiểu cách sử dụng script.

Khắc phục: Sử dụng module argparse, tự động cung cấp thông báo trợ giúp và sử dụng.

import argparse

def main():
    parser = argparse.ArgumentParser(description="Một trình phân tích đối số mẫu.")
    parser.add_argument('arg1', type=str, help="Đối số đầu tiên")
    parser.add_argument('arg2', type=str, help="Đối số thứ hai")
    args = parser.parse_args()
    
    if args.arg1 == 'option1':
        print(f"Đã chọn Option 1 với giá trị {args.arg2}")
    elif args.arg1 == 'option2':
        print(f"Đã chọn Option 2 với giá trị {args.arg2}")
    else:
        print("Option không xác định!")

if __name__ == "__main__":
    main()

 

Không Xác thực Đối số

 

import sys

def main():
    if len(sys.argv) < 3:
        print("Không đủ đối số!")
        return
    
    arg1 = sys.argv[1]
    arg2 = sys.argv[2]
    
    if arg1 == 'option1':
        print(f"Đã chọn Option 1 với giá trị {arg2}")
    elif arg1 == 'option2':
        print(f"Đã chọn Option 2 với giá trị {arg2}")
    else:
        print("Option không xác định!")

if __name__ == "__main__":
    main()


Thực hành xấu: Không xác thực đối số có thể dẫn đến lỗi thời gian chạy hoặc hành vi không mong muốn.

Khắc phục: Sử dụng argparse để chỉ định kiểu đối số và xác thực chúng cho phù hợp.

import argparse

def main():
    parser = argparse.ArgumentParser(description="Một trình phân tích đối số mẫu.")
    parser.add_argument('arg1', type=str, choices=['option1', 'option2'], help="Đối số đầu tiên")
    parser.add_argument('arg2', type=str, help="Đối số thứ hai")
    args = parser.parse_args()
    
    if args.arg1 == 'option1':
        print(f"Đã chọn Option 1 với giá trị {args.arg2}")
    elif args.arg1 == 'option2':
        print(f"Đã chọn Option 2 với giá trị {args.arg2}")

if __name__ == "__main__":
    main()

 

Bỏ qua Trường hợp Ngoại lệ

 

import sys

def main():
    if len(sys.argv) < 3:
        print("Không đủ đối số!")
        return
    
    arg1 = sys.argv[1]
    arg2 = sys.argv[2]
    
    if arg1 == 'option1':
        print(f"Đã chọn Option 1 với giá trị {arg2}")
    elif arg1 == 'option2':
        print(f"Đã chọn Option 2 với giá trị {arg2}")
    else:
        print("Option không xác định!")

if __name__ == "__main__":
    main()


Thực hành xấu: Không xử lý các trường hợp ngoại lệ như thiếu đối số, kiểu dữ liệu không chính xác hoặc giá trị không hợp lệ.

Khắc phục: Sử dụng các tính năng của argparse như giá trị mặc định, kiểm tra kiểu và đối số bắt buộc để xử lý các trường hợp ngoại lệ.

import argparse

def main():
    parser = argparse.ArgumentParser(description="Một trình phân tích đối số mẫu.")
    parser.add_argument('arg1', type=str, choices=['option1', 'option2'], help="Đối số đầu tiên")
    parser.add_argument('arg2', type=str, help="Đối số thứ hai")
    parser.add_argument('--optional', type=int, default=0, help="Một đối số tùy chọn")
    args = parser.parse_args()
    
    if args.arg1 == 'option1':
        print(f"Đã chọn Option 1 với giá trị {args.arg2} và tùy chọn {args.optional}")
    elif args.arg1 == 'option2':
        print(f"Đã chọn Option 2 với giá trị {args.arg2} và tùy chọn {args.optional}")

if __name__ == "__main__":
    main()

 

Đặt Tên Đối số Kém

 

import sys

def main():
    if len(sys.argv) < 3:
        print("Không đủ đối số!")
        return
    
    arg1 = sys.argv[1]
    arg2 = sys.argv[2]
    
    if arg1 == 'option1':
        print(f"Đã chọn Option 1 với giá trị {arg2}")
    elif arg1 == 'option2':
        print(f"Đã chọn Option 2 với giá trị {arg2}")
    else:
        print("Option không xác định!")

if __name__ == "__main__":
    main()


Thực hành xấu: Sử dụng tên đối số không mô tả hoặc mơ hồ có thể gây nhầm lẫn cho người dùng.

Khắc phục: Sử dụng tên đối số rõ ràng và mô tả truyền đạt mục đích của chúng.

import argparse

def main():
    parser = argparse.ArgumentParser(description="Một trình phân tích đối số mẫu.")
    parser.add_argument('command', type=str, choices=['start', 'stop'], help="Lệnh cần thực thi")
    parser.add_argument('value', type=str, help="Giá trị liên quan đến lệnh")
    args = parser.parse_args()
    
    if args.command == 'start':
        print(f"Bắt đầu với giá trị {args.value}")
    elif args.command == 'stop':
        print(f"Dừng lại với giá trị {args.value}")

if __name__ == "__main__":
    main()

 

Tag list:
- args
- Tips
- Tips and Tricks
- parse args python
- args parsers python
- args parsers
- args parse problem
- Args parsers issues
- Argument passing bad practices

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.