+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

在简单的情况下,排除&恢复还是避免异常会更好?

发布于2020-11-19 16:17     阅读(1023)     评论(0)     点赞(5)     收藏(2)


0

1

2

3

4

5

6

7

8

9

考虑:

categories = {'foo':[4], 'mer':[2, 9, 0]}

key = 'bar'
value = 5

我们可以通过以下两种方式安全地将其追加到存储在字典中的列表中:

  1. 为谨慎起见,我们始终会在添加列表之前检查列表是否存在。

    if not somedict.has_key(key):
        somedict[key] = []
    somedict[key].append(value)
    
  2. 直接说,如果有例外,我们只是清理。

    try:
        somedict[key].append(value)
    except KeyError:
        somedict[key] = [value]
    

在这两种情况下,结果可能都是:

{'foo':[4], 'mer':[2, 9, 0], 'bar':[5]}

重申一下我的问题:在这样的简单情况下,谨慎或直接(在风格,效率和哲学方面)会更好吗?


解决方案


您会发现,选择1“谨慎”通常会非常慢。此外,它还会产生晦涩的错误,因为您尝试编写“避免”异常的测试是错误的。

您会发现,选项2“直接”通常更快。它也很可能是正确的,而且人们可以更快,更容易地阅读。

为什么?在内部,Python通常将诸如“ contains”或“ has_key”之类的东西实现为异常测试。

def has_key( self, some_key ):
    try:
        self[some_key]
    except KeyError:
        return False
    return True

由于这通常是一种has_key方法的实现方式,因此除了Python会做的事情之外,您没有理由浪费代码这样做。

从根本上讲,存在正确性问题。许多防止或避免异常的尝试都是不正确的。

例如,尝试确定字符串是否可能是浮点数会遇到很多异常和特殊情况。关于正确执行此操作的唯一方法是这样做。

try:
    x= float( some_string )
except ValueError: 
    # not a floating-point value

只需执行该算法,而不必担心“防止”或“避免”异常。

0

1

2

3

4

5

6

7

8

9



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/621926/4eb6f8d7a1f896996684/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

5 0
收藏该文
已收藏

评论内容:(最多支持255个字符)