[MẸO] Những Sai Lầm Thường Gặp với 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 rất 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ẽ khám phá 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. Key bị thiếu: Xử lý KeyError

 

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

 

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ờ của 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ị None trước khi sử dụng get().
     
  • Sử dụng câu lệnh điều kiện để xử lý các 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 chặn ValueError

 

Sửa đổi một 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 trong quá trình 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 keys hoặc items để tránh các vấn đề sửa đổi.
     
  • Hiểu hậu quả của việc sửa đổi một từ điển trong quá trình lặp.
     
# Lỗi thường gặp dẫn đến ValueError trong quá trình 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 chặn ValueError trong quá trình 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 nên trống

 

4. Kết luận

 

Bằng việc nhận biết 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 quát 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

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.