当前位置: 首页 > 面试题库 >

Python -如何“完美”地覆盖字典?

赖浩荡
2023-03-14
问题内容

如何使dict的子类尽可能“完美” ?最终目标是要有一个简单的字典,其中的键是小写的。

看来应该有一些微小的原语可以重写以完成此工作,但是根据我的所有研究和尝试,似乎并非如此:

  • 如果我覆盖__getitem__/__setitem__,则get/ set不起作用。如何使它们工作?当然,我不需要单独实施它们吗?

  • 我是否在阻止酸洗,我需要实施__setstate__等吗?

  • 我是否需要repr,update以及__init__

  • 我应该只使用mutablemapping(似乎不应该使用UserDict or DictMixin)吗?如果是这样,怎么办?这些文档并不完全具有启发性。

这是我的第一次尝试,get()不起作用,毫无疑问,还有许多其他小问题:

class arbitrary_dict(dict):
    """A dictionary that applies an arbitrary key-altering function
       before accessing the keys."""

    def __keytransform__(self, key):
        return key

    # Overridden methods. List from 
    # https://stackoverflow.com/questions/2390827/how-to-properly-subclass-dict

    def __init__(self, *args, **kwargs):
        self.update(*args, **kwargs)

    # Note: I'm using dict directly, since super(dict, self) doesn't work.
    # I'm not sure why, perhaps dict is not a new-style class.

    def __getitem__(self, key):
        return dict.__getitem__(self, self.__keytransform__(key))

    def __setitem__(self, key, value):
        return dict.__setitem__(self, self.__keytransform__(key), value)

    def __delitem__(self, key):
        return dict.__delitem__(self, self.__keytransform__(key))

    def __contains__(self, key):
        return dict.__contains__(self, self.__keytransform__(key))


class lcdict(arbitrary_dict):
    def __keytransform__(self, key):
        return str(key).lower()

问题答案:

你可以使用collections模块中的ABC(抽象基类)轻松编写一个行为类似于dict的对象。它甚至会告诉你是否错过了一种方法,因此以下是关闭ABC的最低版本。

import collections

class TransformedDict(collections.MutableMapping):
    """A dictionary that applies an arbitrary key-altering
       function before accessing the keys"""

    def __init__(self, *args, **kwargs):
        self.store = dict()
        self.update(dict(*args, **kwargs))  # use the free update to set keys

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

    def __setitem__(self, key, value):
        self.store[self.__keytransform__(key)] = value

    def __delitem__(self, key):
        del self.store[self.__keytransform__(key)]

    def __iter__(self):
        return iter(self.store)

    def __len__(self):
        return len(self.store)

    def __keytransform__(self, key):
        return key

你可以从ABC获得一些免费方法:

class MyTransformedDict(TransformedDict):

    def __keytransform__(self, key):
        return key.lower()


s = MyTransformedDict([('Test', 'test')])

assert s.get('TEST') is s['test']   # free get
assert 'TeSt' in s                  # free __contains__
                                    # free setdefault, __eq__, and so on

import pickle
assert pickle.loads(pickle.dumps(s)) == s
                                    # works too since we just use a normal dict

我不会dict直接继承(或其他内置)。这通常没有任何意义,因为你实际要做的是实现dict的接口。而这正是ABC的目的。



 类似资料:
  • 问题内容: 我正在研究pypreprocessor,它是一种采用c样式指令的预处理器,而且能够使它像传统的预处理器一样工作(它是自耗的,并且可以即时执行后处理的代码),但它会破坏库进口。 问题是:预处理程序运行文件,对其进行处理,将其输出到一个临时文件中,然后执行exec()临时文件。导入的库需要有所不同,因为它们没有执行,而是被加载并可以被调用者模块访问。 我需要做的是:中断导入(因为预处理程序

  • 问题内容: 我正在尝试Backbone.js,而我正在尝试的事情之一就是调用远程API,因此,据我了解的文档资料,我需要能够覆盖Backbone.sync 。 在文档本身中没有如何执行此操作的示例,并且似乎没有用于Backbone的google组…有人可以指出执行此操作的示例吗? 问题答案: 看看这个带注释的源示例,在该示例中,它们被本地存储替代项覆盖 基本上,Backbone.sync应该是一个

  • 我的父模块中的Spring Boot版本是v2.1.17。发布 然后我在子模块中引入了spring boot starter安全性,指定的版本是2.4.4,它覆盖了父模块中的版本(v2.1.17版本)。 然后,我运行了命令,发现子模块中spring-boot-starter-security的版本确实是2.4.4,但spring-boot-starter-security中引用的artifactI

  • 问题内容: 我正在建立一个子类并重写的类。我想确定在可能设置字典项的所有实例中都会调用我的方法。 我发现了三种情况,其中Python(在本例中为2.6.4)在设置值时未调用我的重写方法,而是直接调用 在构造函数中 在方法中 在方法中 作为一个非常简单的测试: 您可以看到仅在显式设置项目时才调用覆盖方法。为了使Python始终调用我的方法,我必须重新实现这三个方法,如下所示: 为了知道Python将

  • 我正在使用来衡量我的测试的代码覆盖率。我已经启用了分支机构覆盖,但我不能完全理解该报告。 没有分支保险,我得到100%的保险: 启用分支覆盖: 有问题的来源可以在这里找到。 <代码>21- 然而,<代码>53-

  • 问题内容: 因此,我有一个自定义类,该类具有与int一起使用的功能。然而,在我的程序(库),它越来越被称为周围的其他方法,即,在那里是我的班。有什么办法可以让它使用我的功能吗? 问题答案: 只需将以下内容添加到类定义中,就可以了: