Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查字典中是否存在条目,这是一种不好的做法吗?_Python_Dictionary_Exception Handling - Fatal编程技术网

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

这段代码使用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有一个更新并更改抛出的异常的名称,它可能会停止工作。这是个坏习惯吗?有更好的方法吗?

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

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')
    ,也就是说,如果找不到键,请提供一个默认值

  • 扩展UserDict

  • 这将为您提供一个字典,自动为所有缺少的键创建一个新列表。您现在可以这样使用它:

    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']