当key为i时使用点表示法在Python中创建字典条目

2024-09-27 23:27:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我将dict子类化如下:

class ObjectiveDict(dict):

    def __getattr__(self, name):
        if name in self:
            return self[name]
        else:
            raise AttributeError("No such attribute: " + name)

    def __setattr__(self, name, value):
        """
        IMPORTANT NOTICE: when "name" is an iterator of an iterable, will not work, must use [] syntax
        """
        self[name] = value

    def __delattr__(self, name):
        if name in self:
            del self[name]
        else:
            raise AttributeError("No such attribute: " + name)

现在当我有类似的东西时:

^{pr2}$

这样可以很好地输出:

{'a': 1, 'b': 2, 'c': 3, 'd': 4}

但是,如果我有一个要附加到objd的键列表,比如使用一个默认值,它使用迭代器在列表上迭代时使用的名称创建一个键,即:

keys = ['key1', 'key2', 'key3']
for k in keys:
    objd.k = None

It输出:

{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'k': None}

我知道我可以使用objd[k] = None或使用setattr方法来克服这个问题,但是我想知道为什么当我使用点表示法时,ObjectiveDict__setattr__方法将迭代器作为字符串来获取?有没有一种方法可以修补我的代码,使它与点符号一起工作?在


Tags: 方法nonameinselfnoneifdef
1条回答
网友
1楼 · 发布于 2024-09-27 23:27:27

因为Python是连贯的。在

在第一个例子中,您对objd.d = 4感到满意,并将其翻译为objd['d'] = 4。但可能是:

d = 'e'
objd.d = 4

你仍然可以得到{'a': 1, 'b': 2, 'c': 3, 'd': 4}(希望不是{'a': 1, 'b': 2, 'c': 3, 'e': 4})。在

所以当你在第二种情况下写下:

^{pr2}$

您只需重复objd.k = None,它被翻译成objd['k'] = None,三次。在

在点表示法中无法使用名称的,只能使用名称本身。在

您可以使用以下方法使其工作:

def __setattr__(self, name, value):
    self[eval(name)] = value

但我真的劝你不要那样做!在第一种情况下,您将得到:

d = 'e'
objd.d = 4
objd

=>;输出:{'a': 1, 'b': 2, 'c': 3, 'e': 4}!在

相关问题 更多 >

    热门问题