[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](/media/filer_public_thumbnails/filer_public/53/22/532205b4-0a89-4637-9f86-e7d316454d2b/python_argument_parsers_issues.png__1500x900_crop_subsampling-2_upscale.png)
![[TIPS] Python Argument Parser - Bad Practices](/media/filer_public_thumbnails/filer_public/53/22/532205b4-0a89-4637-9f86-e7d316454d2b/python_argument_parsers_issues.png__400x240_crop_subsampling-2_upscale.png)
Các Thực Hành Xấu Khi Truyền Đối Số trong Script Python
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ì.
Cách 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ố thứ nhất")
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.
Cách 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ố thứ nhất")
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.
Cách 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ố thứ nhất")
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ệ.
Cách 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ố thứ nhất")
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.
Cách Khắc Phục: Sử dụng tên đối số rõ ràng và mô 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 với giá trị {args.value}")
if __name__ == "__main__":
main()