[MẸO] Những Lỗi Thường Gặp Khi Sử Dụng Từ Điển Python

By JoeVu, at: 15:39 Ngày 16 tháng 12 năm 2023

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

[TIPs] Common Mistakes with Python Dictionaries
[TIPs] Common Mistakes with Python Dictionaries

Từ điển trong Python mạnh mẽ và linh hoạt, nhưng chúng cũng có thể gây khó khăn, đặc biệt là đối với người mới bắt đầu. Trong hướng dẫn ngắn này, chúng ta sẽ làm nổi bật những lỗi thường gặp khi làm việc với từ điển, cung cấp các đoạn mã minh họa các vấn đề và đưa ra các giải pháp đơn giản cùng với các thực tiễn tốt nhất. Ngoài ra, chúng ta sẽ tìm hiểu cách viết các bài kiểm tra đơn vị bằng pytest để bao quát toàn diện các trường hợp này.

 

1. Khóa bị thiếu: Xử lý KeyError

 

Một cạm bẫy phổ biến khi làm việc với từ điển là lỗi KeyError tai tiếng. Hãy cùng khám phá các trường hợp có thể xảy ra và cách xử lý nó một cách duyên dáng.

Ví dụ:

# Lỗi thường gặp dẫn đến KeyError
my_dict = {'name': 'Alice', 'age': 30}
value = my_dict['gender']  # Kết quả là KeyError


Giải pháp và Thực tiễn tốt nhất:

  • Sử dụng phương thức get() để truy xuất giá trị một cách an toàn.
  • Sử dụng giá trị mặc định trong get() để tránh KeyError.
# Giải pháp
my_dict = {'name': 'Alice', 'age': 30}
value = my_dict.get('gender', 'default value')  # giá trị mặc định sẽ là nam/nữ

 

Kiểm tra đơn vị với Pytest:

# Kiểm tra đơn vị Pytest để xử lý KeyError
def test_key_error_handling():
    my_dict = {'name': 'Alice', 'age': 30}
    assert my_dict.get('gender', 'Unknown') == 'Unknown'

 

2. Những bất ngờ từ NoneType: Xử lý lỗi 'NoneType'

 

Sử dụng phương thức get() trên một biến có giá trị là None có thể dẫn đến các lỗi không mong muốn. Hãy cùng thảo luận lý do tại sao điều này xảy ra và cách ngăn chặn nó.

Ví dụ:
 

# Lỗi thường gặp dẫn đến lỗi 'NoneType'
my_variable = None
value = my_variable.get('key', 'default')  # Kết quả là AttributeError


Giải pháp và Thực tiễn tốt nhất:

  • Kiểm tra xem biến có giá trị là None trước khi sử dụng get().
     
  • Sử dụng câu lệnh điều kiện để xử lý trường hợp None một cách rõ ràng.
     
# Giải pháp
my_variable = None
value = my_variable.get('key', 'default') if my_variable else None


Kiểm tra đơn vị với Pytest:
 

# Kiểm tra đơn vị Pytest để xử lý lỗi 'NoneType'
def test_none_type_handling():
    my_variable = None
    with pytest.raises(AttributeError):   

assert my_variable.get('key', 'default')

 

3. Lặp và sửa đổi: Ngăn ngừa ValueError

 

Sửa đổi từ điển trong khi lặp qua nó có thể dẫn đến lỗi ValueError: not enough values to unpack. Hãy cùng khám phá vấn đề này và cách tránh nó.

 

Ví dụ:

 

# Lỗi thường gặp dẫn đến ValueError khi lặp
my_dict = {'a': 1, 'b': 2, 'c': 3}
for key, value in my_dict.items():
    del my_dict[key]  # Kết quả là ValueError


Giải pháp và Thực tiễn tốt nhất:
 

  • Lặp qua một bản sao của các khóa hoặc mục để tránh các vấn đề sửa đổi.
     
  • Hiểu hậu quả của việc sửa đổi từ điển trong khi lặp.
     
# Lỗi thường gặp dẫn đến ValueError khi lặp
my_dict = {'a': 1, 'b': 2, 'c': 3}
for key in my_dict.keys():
    del my_dict[key]

 

Kiểm tra đơn vị với Pytest:

 

# Kiểm tra đơn vị Pytest để ngăn ngừa ValueError khi lặp
def clean_dict(my_dict):
    for key in my_dict.keys():
        del my_dict[key]
    return my_dict


def test_clean_dict():
    my_dict = {'a': 1, 'b': 2, 'c': 3}
    my_dict = clean_dict(my_dict)
    assert not my_dict  # Từ điển sẽ rỗng

 

4. Kết luận

 

Bằng cách nhận thức được những lỗi thường gặp này và áp dụng các thực tiễn tốt nhất, bạn có thể làm cho mã của mình mạnh mẽ hơn khi làm việc với các từ điển Python. Hơn nữa, việc viết các bài kiểm tra đơn vị với pytest đảm bảo rằng mã của bạn có khả năng phục hồi và bao gồm tất cả các trường hợp có thể xảy ra.

Tag list:
- Python
- python dictionary
- python pytest
- python dictionary issues
- pytest unittest
- python dictionary mistakes
- ValueError
- Dictionary
- dictionary mistakes
- KeyError
- python common mistakes
- Dictionaries
- write unittest

Liên quan

Python Learning

Đọc thêm
Python

Đọc thêm

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.