这段代码在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有更新并更改抛出的异常名称,它可能会停止工作。这是一种不好的做法吗?有没有更好的方法呢?
答案 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)
异常的类型不会改变,但有两种解决方案可能更好:
您可以使用attrs.get('class', 'someclass')
,例如,如果无法找到密钥,则提供默认值
扩展UserDict
并覆盖__missing__()
:
class ListDict(UserDict):
def __missing__(key):
return ['someclass']
它为您提供了一个字典,可以自动为所有缺失的键创建一个新列表。您现在可以像这样使用它:
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']