2016-08-06 84 views
2

我目前有一个对象传递给我的回调,这是一个字典,我必须返回。词典:恢复/删除setdefault

调用者在字典上调用obj.setdefault("Server", "Something"),因此即使键/值对不存在,它也具有默认值。

我该如何恢复/删除那个setdefault(删除默认值)?我的意思是我只是不想在字典中使用这个键/值对,并且如果该键没有退出,它似乎没有复杂性,但总是因为缺省值而添加它。

+3

只是删除像任何其他项? 'del obj ['Server']'? – user2357112

+0

只有在默认情况下才想删除它吗? – zondo

+2

可能是一个XY问题。如果你不想让缺省值出现在字典中,不要使用'setdefault(key,default)',而是'get(key,default)'。 –

回答

5

setdefault方法将Server密钥的值设置为Something(只要Server密钥不在字典中)。你可以简单地删除字典中Server键:

if 'Server' in obj: del obj['Server'] 

如果你不想当其值从Something不同删除服务器密钥,这样做:

if obj['Server'] == 'Something': del obj['Server'] 

但是,你不能告诉Server的值是作为默认值还是作为键值对的普通设置添加到字典中。这是因为在调用setdefault之后,字典保存键值对,但没有任何指示如何添加它。

示范:

>>>d = {} 
>>>d.setdefault("Server", "Something") 
>>>d 
{'Server': 'Something'} 
>>>del d['Server'] 
>>>d 
{} 
0

假设传递给回调时该值不在字典中,dict.setdefault并不是真正的问题 - 该操作是许多可用于更改Python字典的操作之一。具体来说,它确保了SOMETHING被存储在给定的键上,这可以通过索引赋值直接完成。只要你的代码和调用者都保持对同一个字典的引用,你就没有真正的选择,只能相信调用者(以及任何其他的参考持有者)。

字典的易变性是个问题,所以可能的解决方案围绕着设计中的余地。我只能想到:

  • 副本字典时它被传递到回调,和/或
  • 改变返回值的副本或词典的(只读)查看
+0

感谢您的指针。有一次,我做了,但我决定坚持简单而直接。编辑。 –