Python: модульный тест не выполнен для метода deep_update с наборами и кортежами – неожиданное поведениеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python: модульный тест не выполнен для метода deep_update с наборами и кортежами – неожиданное поведение

Сообщение Anonymous »

У меня возникла проблема с методом deep_update, который должен рекурсивно обновлять словарь, включая объединение наборов при обнаружении. Однако мой модульный тест не удался именно в случае с множествами. Это функция
@staticmethod
def deep_update(main_dict: Dict, update_dict: Dict) -> None:
"""
深度更新字典
:param main_dict: 原始字典
:param update_dict: 新字典
:return: 更新后的字典
>>> dict1 = {'a': {'b': 1}}
>>> UseDict.deep_update(dict1, {'a': {'c': 2}})
>>> assert dict1 == {'a': {'b': 1, 'c': 2}}
"""
for key, value in update_dict.items():
if key in main_dict:
main_value = main_dict[key]

# Deep update for nested dictionaries
if isinstance(main_value, dict) and isinstance(value, dict):
UseDict.deep_update(main_value, value)

# Concatenate lists
elif isinstance(main_value, list) and isinstance(value, list):
main_dict[key] = main_value + value

# Union sets
elif isinstance(main_value, set) and isinstance(value, set):
main_dict[key] = main_value | value

# Concatenate tuples
elif isinstance(main_value, tuple) and isinstance(value, tuple):
main_dict[key] = main_value + value

else:
# Update primitive types or handle other types directly
main_dict[key] = value
else:
# If key doesn't exist in main_dict, add it
main_dict[key] = value

return main_dict


Эти примеры работают нормально. Но модульный тест для набора и кортежей этого не делает:
Примеры:
# Example 1: Deep update with nested dictionaries
main_dict = {'a': {'b': 1}}
update_dict = {'a': {'c': 2}}
print("Input (Nested Dicts):")
print("Main Dictionary:", main_dict)
print("Update Dictionary:", update_dict)
UseDict.deep_update(main_dict, update_dict)
print("Updated Dictionary (Nested Dicts):", main_dict)
# Expected Output: {'a': {'b': 1, 'c': 2}}

# Example 2: Deep update with lists
main_dict = {'a': [1, 2]}
update_dict = {'a': [3, 4]}
print("\nInput (Lists):")
print("Main Dictionary:", main_dict)
print("Update Dictionary:", update_dict)
UseDict.deep_update(main_dict, update_dict)
print("Updated Dictionary (Lists):", main_dict)
# Expected Output: {'a': [1, 2, 3, 4]}

# Example 3: Deep update with sets
main_dict = {'a': {1, 2}}
update_dict = {'a': {3, 4}}
print("\nInput (Sets):")
print("Main Dictionary:", main_dict)
print("Update Dictionary:", update_dict)
answer = UseDict.deep_update(main_dict, update_dict)
print(answer)
# print("Updated Dictionary (Sets):", main_dict)
# Expected Output: {'a': {1, 2, 3, 4}}

# Example 4: Deep update with tuples
main_dict = {'a': (1, 2)}
update_dict = {'a': (3, 4)}
print("\nInput (Tuples):")
print("Main Dictionary:", main_dict)
print("Update Dictionary:", update_dict)
UseDict.deep_update(main_dict, update_dict)
print("Updated Dictionary (Tuples):", main_dict)
# Expected Output: {'a': (1, 2, 3, 4)}


Тесты:
def test_deep_update():
# Test with nested dictionaries
main_dict = {'a': {'b': 1}}
update_dict = {'a': {'c': 2}}
useDict.deep_update(main_dict, update_dict)
assert main_dict == {'a': {'b': 1, 'c': 2}}

# Test with lists
main_dict = {'a': [1, 2]}
update_dict = {'a': [3, 4]}
useDict.deep_update(main_dict, update_dict)
assert main_dict == {'a': [1, 2, 3, 4]}

# Test with sets
main_dict = {'a': {1, 2}}
update_dict = {'a': {3, 4}}
UseDict.deep_update(main_dict, update_dict)
assert main_dict == {'a': {1, 2, 3, 4}}

# Test with tuples
main_dict = {'a': (1, 2)}
update_dict = {'a': (3, 4)}
useDict.deep_update(main_dict, update_dict)
assert main_dict == {'a': (1, 2, 3, 4)}

# Test with conflicting types (dict vs list)
main_dict = {'a': {'b': 1}}
update_dict = {'a': [2, 3]}
useDict.deep_update(main_dict, update_dict)
assert main_dict == {'a': [2, 3]} # List should replace the dict

Ожидается для наборов:
assert main_dict == {'a': {1, 2, 3, 4}}

Ожидается для кортежей:
assert main_dict == {'a': (1, 2, 3, 4)}


Подробнее здесь: https://stackoverflow.com/questions/791 ... unexpected
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»