检查字典中是否存在某个项目,这是一种不好的做法吗?

时间:2013-03-06 17:12:36

标签: python dictionary exception-handling

这段代码在python中运行得很好:

# tests if class exists in the dictionary attrs
try:
    self.attrs['class']
# if it doesnt python will throw an exception
except KeyError:
    self.attrs['class'] = "someclass"
# else it is defined, so we concat someclass to previous value
else:
    self.attrs['class'] = "someclass %s" % self.attrs['class']

虽然,我担心这不是一个好习惯,因为如果python有更新并更改抛出的异常名称,它可能会停止工作。这是一种不好的做法吗?有没有更好的方法呢?

7 个答案:

答案 0 :(得分:4)

你有比你需要的更多的查找...在这种情况下,你可能会做类似的事情:

self.attrs['class'] = 'someclass %s' % self.attrs.get('class','')

这会给你:

'someclass '

如果你的词典中已经没有'class'键(这是一个与之前不同的空格)。

答案 1 :(得分:2)

@ mgilson的答案很棒。这是另一种可能更容易理解并解决最后一个空间问题的方法:

if 'class' in self.attrs:
    self.attrs['class'] = "someclass %s" % self.attrs['class']
else:
    self.attrs['class'] = "someclass"

答案 2 :(得分:2)

为什么在可以使用成员资格测试时依赖异常:

# tests if class exists in the dictionary attrs
if 'class' in self.attrs:
    self.attrs['class'] = "someclass %s" % self.attrs['class']
else:
    self.attrs['class'] = "someclass"

或者至少,删除noop try:

# tests if class exists in the dictionary attrs
try:
    self.attrs['class'] = "someclass %s" % self.attrs['class']
except KeyError:
    self.attrs['class'] = "someclass"

答案 3 :(得分:1)

此代码效率低下,因为在成功路径上它仍然会查找原始'class'值两次。试试这个

try:
    v = self.attrs['class']
    self.attrs['class'] = "someclass %s" % v
except KeyError:
    self.attrs['class'] = "someclass"

答案 4 :(得分:1)

异常的类型不会改变,但有两种解决方案可能更好:

  1. 您可以使用attrs.get('class', 'someclass'),例如,如果无法找到密钥,则提供默认值

  2. 扩展UserDict并覆盖__missing__()

    class ListDict(UserDict):
        def __missing__(key):
            return ['someclass']
    
  3. 它为您提供了一个字典,可以自动为所有缺失的键创建一个新列表。您现在可以像这样使用它:

    self.attrs['class'].append(v)
    

答案 5 :(得分:0)

我认为异常的名称不应该改变,但是如果你需要在字典上执行那种逻辑(如果它不存在则添加新元素或者如果它是更新),则可能是也实现如下(是一个例子,我希望它有所帮助):

if not "class" in self.attrs:

   self.attrs['class'] = 'newclass'
else:
    self.attrs['class'] = "someclass %s" % self.attrs['class']

条件的第一部分检查元素是否在dict的键列表中。这应该对你有用,作为一种“习语”。 问候。

答案 6 :(得分:0)

如果您自己创建attrs词典,可以使用DefaultDict

from collections import defaultdict

attrs = defaultdict(str)

attrs['class'] = "someclass %s" % attrs['class']