MST

星途 面试题库

面试题:Python中如何保证字典部分数据的不可变性

在Python中,通常字典是可变的。但假设你有一个字典,其中部分键值对代表一些固定的配置信息,不希望被修改。请描述一种方法来实现这部分数据的不可变性,并给出相应的代码示例。
27.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 使用types.MappingProxyType实现
    • types.MappingProxyType可以创建一个只读的映射视图,对原字典的修改会反映到视图中,但不能通过视图修改原字典。
    • 代码示例:
from types import MappingProxyType

original_dict = {
    'config1': 'value1',
    'config2': 'value2',
    'changeable': 'initial'
}

# 创建只读视图
immutable_config = MappingProxyType({k: v for k, v in original_dict.items() if k.startswith('config')})

print(immutable_config['config1'])  # 可以正常读取

# 尝试修改会报错
# immutable_config['config1'] = 'new value'
# 这行代码会抛出TypeError: 'mappingproxy' object does not support item assignment

original_dict['config1'] = 'new value'
print(immutable_config['config1'])  # 原字典修改后,视图能反映变化
  1. 自定义类实现不可变字典部分
    • 可以定义一个类,在类中实现对固定配置部分的保护。
    • 代码示例:
class ImmutableConfigDict:
    def __init__(self, data):
        self._data = data
        self._immutable_keys = {k for k in data if k.startswith('config')}

    def __getitem__(self, key):
        return self._data[key]

    def __setitem__(self, key, value):
        if key in self._immutable_keys:
            raise ValueError(f"Key {key} is immutable")
        self._data[key] = value


my_dict = {
    'config1': 'value1',
    'config2': 'value2',
    'changeable': 'initial'
}
immutable_dict = ImmutableConfigDict(my_dict)

print(immutable_dict['config1'])
# 尝试修改不可变键会报错
# immutable_dict['config1'] = 'new value'
# 这行代码会抛出ValueError: Key config1 is immutable

immutable_dict['changeable'] = 'new value'
print(immutable_dict['changeable'])