我希望得到您对两个代码段中的哪一个是处理查找的 pythonic 方式的反馈。
我正在开发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
我真的很感激你的想法!
答案 0 :(得分:4)
后者符合您对标准Python类型的期望,可以简化为:
def get_Entity(self, id):
return self.my_dict[id]
如果KeyError
不在id
,则会为您提升self.my_dict
。获取错误会告诉调用函数字典中的内容不是 - 静静地返回None
会让您稍后会遇到细微的错误(除非您立即检查if val is None
,在这种情况下您可以无论如何都使用了try
。
(另一个版本也可以简化为:
def get_Entity(self, id):
return self.my_dict.get(id)
)。
答案 1 :(得分:2)
dict
已包含2个行为。 (get
- > None
和[]
- > KeyError
)。
此外,None
是dict的有效值:
my_dict = {'key': None}
my_dict['key']
# Returns None
答案 2 :(得分:1)
好的,这将是一个通用的,但看看程序员使用你的库的期望。如果我在XML文件中进行查找,我可能希望得到一个结果。
让我们说我是一个懒惰的程序员,他没有验证你返回给我的东西并尝试使用它。如果你给我一个特殊的无效值,我的代码将会继续运行并且稍后会遇到错误,这对我来说可能并不明显,这是根本原因。
另一方面,如果您在我请求无效值后立即抛出异常,我的程序会立即崩溃,并准确解释出现了什么问题。
如果程序员都对你的库返回的方式进行了仔细的验证,那么任何一种方式都可以正常工作但更懒散(大多数:P)程序员可能不会这样做,因此异常路由将提供最少的惊喜和困惑。作为一个图书馆,你可以避免在可避免的情况下惊讶或混淆你的用户,所以我会选择例外路线。
但是我会很快注意到,如果执行无效查找是库工作流程中的“正常”操作,您可以更合理地期望程序员检查,然后才变得合理。
记住经验法则,当动作实际上异常且令人惊讶时使用异常,否则你可能不需要ymmv。