2013-03-06 86 views
1

此代码是在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'] 

虽然,这恐怕不是一个好的做法,因为如果蟒蛇有一个更新,并且改变抛出的异常,它可能会停止工作的名称。这是不好的做法吗?有没有更好的方法来做到这一点?

+1

从我pythonism的理解它实际上不是。你不应该担心名称改变。这会破坏太多的代码,而不是重要的更新,而这些更新都是你知道的。 – 2013-03-06 17:14:29

+1

你可能会发现http://programmers.stackexchange.com/questions/175655/python-forgiveness-vs-permission-and-duck-typing有趣。 – George 2013-03-06 17:27:11

回答

4

您有更多查找有比你需要......在这种情况下,你也许可以这样做:

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

这会给你:

'someclass ' 

如果'class'键不是已经在你的词典中(这是一个不同于以前的空间)。

+0

我喜欢单线解决方案,但这个空间对我来说有所不同。 – StaticX 2013-03-06 17:25:32

+2

@StaticX - 如果需要的话,你可以在所有的末尾加上'.rstrip()'。 '('someclass%s'%self.attrs.get('class',''))。rstrip()' - 在Cpython中,这非常有效。它不创建一个新的字符串,除非它真的需要。 – mgilson 2013-03-06 17:29:56

+0

在Eric答案中添加其他2个解决方案,我会将您的标记标记为最佳解决方案。 – StaticX 2013-03-06 17:44:35

1

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

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

我同意,我的错误。我喜欢你的解决方案,但@ diego-herranz不需要你创建的这个辅助变量'v'。虽然使用try更加pythonic。这是不好的,我不能选择这两个答案。 – StaticX 2013-03-06 17:30:15

+0

@StaticX不用担心,你应该总是选择你觉得最好的答案。 – JaredPar 2013-03-06 19:43:36

1

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

  1. 您可以使用attrs.get('class', 'someclass'),即提供一个默认值,如果键还可以“T中找到

  2. 扩展UserDict并覆盖__missing__()

    class ListDict(UserDict): 
        def __missing__(key): 
         return ['someclass'] 
    

这给你一个字典,它会自动为所有丢失的键创建一个新的列表。你现在可以像这样使用它:

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

@ mgilson的回答非常好。这是另一种方法,也许更容易理解和解决的最后一个空间问题:

if 'class' in self.attrs: 
    self.attrs['class'] = "someclass %s" % self.attrs['class'] 
else: 
    self.attrs['class'] = "someclass" 
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" 

或者至少是,删除在空操作尝试:

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

我觉得异常的名字不应该被改变,但是如果你需要在一个字典执行那种逻辑(添加如果新元素的不存在,或更新,如果它是),可以还执行像下面的(是一个例子,我希望它有助于):

if not "class" in self.attrs: 

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

的条件检查的第一部分,如果元件距离字典的键列表。这对你来说应该是一种“成语”。 此致敬礼。

0

如果你正在创建的ATTRS字典自己,你可以使用一个DefaultDict

from collections import defaultdict 

attrs = defaultdict(str) 

attrs['class'] = "someclass %s" % attrs['class'] 
相关问题