2014-04-25 98 views
4

我想得到您的意见,哪两个片段是更多的pythonic方式来处理查找。Python:抛出异常或返回无?

我正在开发一个XML文件的包装。我正在加载XML文件,解析它,将内容存储在字典中,然后通过类方法进行访问。

特别是 - 如果一个给定的返回没有结果,我应该返回None还是引发(Key)错误?

我有点困惑,因为有人建议我抛出一个错误而不是返回一个空值。他们说,处理错误没有更高层次会更容易和更清楚。

这是代码的简化版本:

class NoResult(KeyError): 
    pass 



class Wrapper(object): 
    .... 

    self.my_dict = {} 

    .... 

    get_Entity(self, id): 
     if id in self.my_dict: 
      value = self.my_dict[id] 
      return value 
     else: 
      return None 





class Wrapper(object): 

    .... 

    self.my_dict = {} 

    .... 

    get_Entity(self, id): 
     if id in self.my_dict: 
      value = self.my_dict[id] 
      return value 
     else: 
      throw NoResult 

我真的很感激您的想法!

+2

两种方式都是Pythonic。如果某些现有条目有可能是“无”,则返回“无”将不明确。实际上,你可能只是实现了两者,就像已经为'dict'完成的那样:'d [key]'引发一个异常,'d.get(key)'返回'None'(或者其他默认值:'d .get(key,default)')。 –

+1

虽然这里有一个意见元素,我不认为这是“主要基于意见”,事实上python文档特别推荐EAFP代码相对于LBYL代码。这至少应该为回答这个问题提供客观的基础。 – Vality

回答

4

后者匹配你所期望的标准Python类型的东西,可以简化为:

def get_Entity(self, id): 
    return self.my_dict[id] 

这将提高KeyError你,如果idself.my_dict。获取错误告诉调用函数,字典中预期的内容不是 - 悄悄地返回None让您稍后打开微妙的错误(除非您立即检查if val is None,在这种情况下,您可以使用try)。

(另一个版本也可以被简化,以:

def get_Entity(self, id): 
    return self.my_dict.get(id) 

)。

+1

我的想法确切! – njzk2

2

dict已包含2个行为。 (getNone[]KeyError)。

此外,None是一个字典的有效值:

my_dict = {'key': None} 
my_dict['key'] 
# Returns None 
+1

+1表示“'无'是字典的有效值”;我没有想到这一点,但另一种微妙的错误的可能性 – jonrsharpe

1

好吧,这将是一个有点普通,但看起来在使用图书馆程序员的期望。如果我正在一个XML文件中查找,我可能期待我会得到一个结果。

可以说我是一个懒惰的程序员,他不确认你返回给我的东西,然后尝试并使用它。如果您返回给我一个特殊的无值,我的代码将继续运行,稍后会遇到错误,并且对我而言可能并不明显,这是根本原因。

另一方面,如果您在请求无效值时立即抛出异常,我的程序将立即崩溃并给出准确的错误解释。

如果程序员都对你的库返回的内容做了仔细的验证,那么任何一种方式都可以正常工作,但是更加懒惰(最多:P)的程序员可能不会这样做,因此异常路由将提供最少的惊喜和困惑。作为一个图书馆,你永远不想在可避免的时候让你的用户感到惊讶或困惑,所以我会选择异常路线。

但是我会很快注意到,如果在你的图书馆工作流程中进行无效查找是一个'正常'操作,那么你可以更合理地期望程序员检查以便或者变得合理。

记住经验法则,当动作实际上是特殊的和令人惊讶的时候使用异常,否则ymmv但你可能不需要。