2016-03-24 39 views
1
self.dictionary.get(tuple_row_column, self.raiseError()) 
  1. 有一种方法,以提高错误而不定义将手动引发错误的方法?
  2. 即使字典包含密钥,也会调用self.raiseError()方法。这是为什么?

回答

1

这是因为.get首先评估默认参数,因为它需要知道在缺少密钥的情况下要返回什么。正如注释中指出的那样 - 如果您的字典包含任何其布尔值计算为False(如空字符串,0,False,[]等)的任何内容,则此方法将引发错误self.dictionary.get(tuple_row_column) or self.raiseError();无论哪种方式,如果你想提出一个错误,如果有一个缺失的关键,支架查找更pythonic。

关于第一个问题,你可以只是做

self.dictionary[tuple_row_column] # Raises KeyError if tuple_row_column not present in dictionary keys. 

如果你想要提高你的错误,你可以说:

try: 
    self.dictionary[tuple_row_column] 
except KeyError: 
    self.raiseError() 
+1

如果在布尔上下文中值为False,则self.dictionary.get(tuple_row_column)或self.raiseError()不起作用 – niemmi

+0

@niemmi,非常好的一点,感谢您的支持! – Bahrom

+0

我认为使用控制流的异常往往会被忽视。 –

2

Python是严格的评估,这意味着所有的函数调用的参数在之前被评估为,该函数被调用。因此self.raiseError()必须运行,无论是否需要(与非严格或“懒惰”的语言没有此限制)。

如果您使用的下标,而不是get

self.dictionary[tuple_row_column] 

这将提高KeyError如果没有映射。