如何在python中传入包含其他元素的字典?

Mit*_*tch 9 python dictionary

我有一本字典:

big_dict = {1:"1",
            2:"2",
            ...
            1000:"1000"}
Run Code Online (Sandbox Code Playgroud)

(注意:我的字典实际上不是字符串的数字)

我将这个字典传递给一个需要它的函数.我经常使用字典来实现不同的功能.但是,有时候我想发送big_dict一个额外的密钥:项目对,这样我想发送的字典就相当于:

big_dict[1001]="1001"
Run Code Online (Sandbox Code Playgroud)

但我不想实际将值添加到字典中.我可以制作字典的副本并将其添加到那里,但我想避免这会消耗的内存+ CPU周期.

我目前的代码是:

big_dict[1001]="1001"
function_that_uses_dict(big_dict)
del big_dict[1001]
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但它似乎相当笨拙.

如果这是一个我会做的字符串:

function_that_uses_string(myString + 'what I want to add on')
Run Code Online (Sandbox Code Playgroud)

用字典有没有相同的方法呢?

Bar*_*zKP 7

正如Veedrac他的回答中指出的那样,这个问题已经在Python 3.3+中以ChainMap类的形式得到了解决:

function_that_uses_dict(ChainMap({1001 : "1001"}, big_dict))
Run Code Online (Sandbox Code Playgroud)

如果你没有Python 3.3你应该使用backport,如果由于某种原因你不想,那么在下面你可以看到如何自己实现它:)


您可以创建一个包装器,类似于:

class DictAdditionalValueWrapper:
    def __init__(self, baseDict, specialKey, specialValue):
        self.baseDict = baseDict
        self.specialKey = specialKey
        self.specialValue = specialValue

    def __getitem__(self, key):
        if key == self.specialKey:
            return self.specialValue

        return self.baseDict[key]

    # ...
Run Code Online (Sandbox Code Playgroud)

dict当然,您需要提供所有其他方法,或者使用UserDict作为基类,这应该简化这一点.

然后像这样使用它:

function_that_uses_dict(DictAdditionalValueWrapper(big_dict, 1001, "1001"))
Run Code Online (Sandbox Code Playgroud)

这可以很容易地扩展到"特殊"键和值的整个附加字典,而不仅仅是单个附加元素.


您还可以扩展此方法以达到类似于字符串示例中的类似内容:

class AdditionalKeyValuePair:
    def __init__(self, specialKey, specialValue):
        self.specialKey = specialKey
        self.specialValue = specialValue

    def __add__(self, d):
        if not isinstance(d, dict):
            raise Exception("Not a dict in AdditionalKeyValuePair")

        return DictAdditionalValueWrapper(d, self.specialKey, self.specialValue)
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

function_that_uses_dict(AdditionalKeyValuePair(1001, "1001") + big_dict)
Run Code Online (Sandbox Code Playgroud)