我试着把一堆数据从文本文件读入字典,我做了几个小的拼写错误,最终创建了新的键/值对并 destruct 了程序(这可能很烦人,调试起来很痛苦).

这让我想知道是否有一种方法可以创建一个字典,在初始声明之后不能添加或删除任何键.我觉得这是必然存在的东西,但我找不到它的例子;有人知道什么东西符合这个要求吗?

def change_key(dictionary, key, new_value):
    a = dictionary.__len__()
    dictionary[key] = new_value
    if dictionary.__len__() != a:
        raise ValueError("new key added")

我想要的是上述代码的更优雅的实现,即:

  1. 不是一堆乱七八糟的代码

  2. 能够处理诸如追加到嵌套列表或添加到嵌套dict之类的事情

  3. 合理有效

推荐答案

我相信您正在寻找的是一个具有__slots__个方法的数据类(在Python 3.10+中,这可以通过@dataclass(slots=True)实现):

from dataclasses import dataclass, asdict


@dataclass
class FixedKeys:
    __slots__ = ("key_1", "key_2", "key_3")
    key_1: str
    key_2: str
    key_3: str


d = FixedKeys(key_1="something", key_2="something_else", key_3="another_thing")
d.key_1 = "updated_value"  # This will work fine
d.key_that_was_not_predefined = "some value"  # This will raise AttributeError
d = asdict(d)  # This converts a dataclass instance to a normal dictionary

Python相关问答推荐

如何在solve()之后获得症状上的等式的值

导入...从...混乱

未知依赖项pin—1阻止conda安装""

python中的解释会在后台调用函数吗?

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

如何更改groupby作用域以找到满足掩码条件的第一个值?

使用BeautifulSoup抓取所有链接

Python—转换日期:价目表到新行

如何在海上配对图中使某些标记周围的黑色边框

Odoo16:模板中使用的docs变量在哪里定义?

用两个字符串构建回文

在numpy数组中寻找楼梯状 struct

如何反转一个框架中列的值?

当HTTP 201响应包含 Big Data 的POST请求时,应该是什么?  

用由数据帧的相应元素形成的列表的函数来替换列的行中的值

基于2级列表的Pandas 切片3级多索引

从`end_date`回溯,如何计算以极为单位的滚动统计量?

通过PyTorch中的MIN函数传递渐变

Django LoginView中的一个大问题

滚动加权平均(或类似)填充失踪大Pandas