2

这段代码在 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 有更新并更改抛出的异常名称,它可能会停止工作。这是一个不好的做法吗?有没有更好的方法来做到这一点?

4

7 回答 7

4

您在那里进行的查找比您需要的要多得多......在这种情况下,您可能会执行以下操作:

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

这会给你:

'someclass '

但是,如果'class'密钥不在您的字典中(与以前不同的一个空格)。

于 2013-03-06T17:15:01.957 回答
2

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

if 'class' in self.attrs:
    self.attrs['class'] = "someclass %s" % self.attrs['class']
else:
    self.attrs['class'] = "someclass"
于 2013-03-06T17:22:06.897 回答
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 尝试:

# tests if class exists in the dictionary attrs
try:
    self.attrs['class'] = "someclass %s" % self.attrs['class']
except KeyError:
    self.attrs['class'] = "someclass"
于 2013-03-06T17:23:34.710 回答
1

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

try:
    v = self.attrs['class']
    self.attrs['class'] = "someclass %s" % v
except KeyError:
    self.attrs['class'] = "someclass"
于 2013-03-06T17:15:29.490 回答
1

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

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

  2. 扩展UserDict和覆盖__missing__()

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

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

self.attrs['class'].append(v)
于 2013-03-06T17:16:28.897 回答
0

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

if not "class" in self.attrs:

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

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

于 2013-03-06T17:24:21.573 回答
0

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

from collections import defaultdict

attrs = defaultdict(str)

attrs['class'] = "someclass %s" % attrs['class']
于 2013-03-06T17:24:41.773 回答