Python 检查字典中是否存在条目,这是一种不好的做法吗?
这段代码使用python编写,工作正常:Python 检查字典中是否存在条目,这是一种不好的做法吗?,python,dictionary,exception-handling,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 pre
# 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有一个更新并更改抛出的异常的名称,它可能会停止工作。这是个坏习惯吗?有更好的方法吗?您在那里的查找比您需要的多得多。。。在这种情况下,您可能会执行以下操作:
self.attrs['class'] = 'someclass %s' % self.attrs.get('class','')
这将为您提供:
'someclass '
但是,如果dict中没有
'class'
键(与以前不同的是一个空格)。此代码效率低下,因为在成功路径上,它仍然会两次查找原始的'class'
值。试试这个
try:
v = self.attrs['class']
self.attrs['class'] = "someclass %s" % v
except KeyError:
self.attrs['class'] = "someclass"
异常的类型不会改变,但有两种解决方案可能更好:
attrs.get('class','someclass')
,也就是说,如果找不到键,请提供一个默认值
self.attrs['class'].append(v)
@米吉尔森的回答很好。这是另一种可能更容易理解并解决最后一个空间问题的方法:
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
if 'class' in self.attrs:
self.attrs['class'] = "someclass %s" % self.attrs['class']
else:
self.attrs['class'] = "someclass"
或者至少,移除noop尝试:
# tests if class exists in the dictionary attrs
try:
self.attrs['class'] = "someclass %s" % self.attrs['class']
except KeyError:
self.attrs['class'] = "someclass"
我认为异常的名称不应该改变,但是如果您需要在字典上执行这种逻辑(如果不存在则添加新元素,如果存在则更新),也可以像下面这样实现(这是一个示例,希望有帮助): 条件的第一部分检查元素是否在dict的键列表中。作为一种“习惯用法”,这对您应该很有用。
注意。如果您自己创建ATTR字典,您可以使用:
从我对pythonism的理解来看,事实并非如此。你不必担心名字会变。这将破坏太多的代码,除了您知道的主要更新之外,无法将其放入任何内容中。您可能会发现这很有趣。我喜欢单线解决方案,但这个空间对我来说很重要。@StaticX--如果需要,您可以在所有更新的最后使用
.rstrip()
<代码>('someclass%s'%self.attrs.get('class','')).rstrip()——在Cpython中,这是非常有效的。除非确实需要,否则它不会创建新字符串。在Eric answer中添加其他两个解决方案,我会将您的解决方案标记为最佳解决方案。我同意,我的错误。我喜欢你的解决方案,但是@diego herranz不需要你创建的这个辅助变量“v”。尽管使用try更像python。很糟糕,我不能选择这两个答案。@StaticX不用担心,你应该总是选择你认为最好的答案。
# tests if class exists in the dictionary attrs
try:
self.attrs['class'] = "someclass %s" % self.attrs['class']
except KeyError:
self.attrs['class'] = "someclass"
if not "class" in self.attrs:
self.attrs['class'] = 'newclass'
else:
self.attrs['class'] = "someclass %s" % self.attrs['class']
from collections import defaultdict
attrs = defaultdict(str)
attrs['class'] = "someclass %s" % attrs['class']