[TIPS] Common Mistakes with Python Dictionaries

By JoeVu, at: Dec. 16, 2023, 3:39 p.m.

Estimated Reading Time: 4 min read

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

Dictionaries in Python are powerful and flexible, but they can be tricky, especially for beginners. In this short guide, we'll highlight common mistakes when working with dictionaries, provide code snippets illustrating the issues, and offer simple solutions along with best practices. Additionally, we'll explore how to write unit tests using pytest to cover these cases comprehensively.

 

1. Missing Key: KeyError Handling

A common pitfall when working with dictionaries is the infamous KeyError. Let's explore scenarios where it can occur and how to handle it gracefully.

Example:

# Common mistake leading to KeyError
my_dict = {'name': 'Alice', 'age': 30}
value = my_dict['gender']  # Results in KeyError


Solutions and Best Practices:

  • Introduce the get() method to safely retrieve values.
  • Demonstrate the use of default values in get() to avoid KeyError.
# Solution
my_dict = {'name': 'Alice', 'age': 30}
value = my_dict.get('gender', 'default value')  # the default value would be male/female

 

Unit Test with Pytest:

# Pytest unit test for KeyError handling
def test_key_error_handling():
    my_dict = {'name': 'Alice', 'age': 30}
    assert my_dict.get('gender', 'Unknown') == 'Unknown'

 

2. NoneType Surprises: Handling 'NoneType' Errors

Using the get() method on a variable that is None can lead to unexpected errors. Let's discuss why this happens and how to prevent it.

Example:

# Common mistake resulting in 'NoneType' error
my_variable = None
value = my_variable.get('key', 'default')  # Results in AttributeError


Solutions and Best Practices:

  • Emphasize checking for None before using get().
  • Use conditional statements to handle None cases explicitly.
# Solution
my_variable = None
value = my_variable.get('key', 'default') if my_variable else None


Unit Test with Pytest:

# Pytest unit test for 'NoneType' error handling
def test_none_type_handling():
    my_variable = None
    with pytest.raises(AttributeError):   

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

 

3. Iterating and Modifying: ValueError Prevention

Modifying a dictionary while iterating through it can lead to ValueError: not enough values to unpack. Let's explore this issue and how to avoid it.

Example:

# Common mistake resulting in ValueError during iteration
my_dict = {'a': 1, 'b': 2, 'c': 3}
for key, value in my_dict.items():
    del my_dict[key]  # Results in ValueError


Solutions and Best Practices:

  • Iterate over a copy of keys or items to avoid modification issues.
  • Understand the consequences of modifying a dictionary during iteration.
# Common mistake resulting in ValueError during iteration
my_dict = {'a': 1, 'b': 2, 'c': 3}
for key in my_dict.keys():
    del my_dict[key]


Unit Test with Pytest:

# Pytest unit test for ValueError prevention during iteration
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  # Dictionary should be empty

 

 

4. Conclusion

By being aware of these common mistakes and adopting best practices, you can make your code more robust when working with Python dictionaries. Furthermore, writing unit tests with pytest ensures that your code is resilient and covers all possible scenarios.


Subscribe

Subscribe to our newsletter and never miss out lastest news.