使用异常来分配变量是不好的做法吗?

时间:2015-03-26 23:15:41

标签: python exception dictionary exception-handling variable-assignment

使用以下内容实际执行“是不好的做法”如果dict和key存在,添加一个项目,如果没有,先创建dict和键然后添加到它“< / em>的

其他问题:我是否必须在实例化时self.elements = {}首次添加它才能工作,或者是否会在第一次self.elements[elemType] = ...时动态创建它?

它在控制台中工作,但我确信我之前有过这样的错误。

try:
    self.elements[elemType][elemObj.id] = elemObj
except KeyError as _:
    self.elements[elemType] = {elemObj.id:elemObj}

2 个答案:

答案 0 :(得分:0)

异常总是很慢。您可以通过使用dict update来分配值。

>>> foo = {1: {}}
>>> foo[1].update({1: 2})
>>> foo
{1: {1: 2}}
>>> foo[1].update({1: 3})
>>> foo
{1: {1: 3}}
>>> foo[1].update({2: 4})
>>> foo
{1: {1: 3, 2: 4}}

所以在你的情况下,它看起来像

self.elements[elemType].update({elemObj.id: elemObj})

如果元素[elemType]可能不存在,则更复杂

self.elements.update({elemType: {elemObj.id: elemObj} })

UPD

对于不覆盖elemType - 可以检查它是否不存在。

if elemType not in self.elements:
    self.elements[elemType] = {}
self.elements[elemType].update({elemObj.id: elemObj})

答案 1 :(得分:0)

决定查看哪些内容仍然有效iftry

if.py

d = {}
for i in range(int(1e+6)):
    if i in d:
        d[i] += 1
    else:
        d[i] = 1

try.py

d = {}
for i in range(int(1e+6)):
    try:
        d[i] += 1
    except KeyError:
        d[i] = 1

if

的结果时间
$ time python if.py 

real    0m0.269s
user    0m0.224s
sys     0m0.044s

尝试的结果时间

$ time python try.py 

real    0m0.899s
user    0m0.858s
sys     0m0.040s

所以iftry快三倍。