我正在使用基于Python的API,其中有许多函数可用于查询事物,例如doesPointExist
,findPoint
,canCreateNewPoint
等,其中否定结果会引发异常。这使得代码更加混乱,填充了try / catch语句,而不是直接将结果用作布尔值。
由于我不是Python专家,我想知道这个设计是不是Pythonic?我没有在标准库中看到过这种设计,所以我假设Python API中的这种异常使用是不受欢迎的?
答案 0 :(得分:6)
听起来像设计糟糕的API。
doesPointExist
应返回True
或False
,当该点不存在时,它不应引发异常。findPoint
应返回Point
个对象或None
。canCreateNewPoint
应返回True
或False
出于类似原因。例外是针对例外情况。
答案 1 :(得分:6)
API设计有点艺术。函数的名称应该表明它的行为方式,包括设置用户期望。名为findPoint
的函数意味着搜索可能会失败,因此不存在此类点的情况并非例外,并且可能会返回None
来表示结果。但是,名为getPoint
的函数会向我暗示它始终可以返回请求的点。失败是出乎意料的,并且需要提出异常。
答案 2 :(得分:3)
我不同意你不会在标准库中找到它。例如,"abc".index("d")
引发ValueError
,许多库自由地引发异常。
我会说这取决于失败行动的后果。
False
,如果它是肯定的或没有问题的话。)findPoint()
通常返回调用者想要使用的Point
对象,{{1}}可能会这样做。答案 3 :(得分:2)
1,我建议对特定情况使用异常,因此在常见情况下不需要对它们进行测试。
2,您应该阅读有关您的职能名称的指南PEP8 Naming Conventions。
答案 4 :(得分:2)
这不是Python独有的。其他答案都很好,但只有一些额外的想法不适合评论:
在Python中,与大多数解释语言一样,由于开销太高,异常相对便宜,因此在Python中使用EAFP比在C ++中更常见,比如C ++,其中开销较低,异常(相对)更多昂贵。
请注意,函数可能都会返回值,可能会抛出异常。
在您的示例中,像doesPointExist
这样的函数意味着用户在尝试某事之前实际上想要验证访问权限。这是LBYL。抛出异常作为结果值是EAFP编程风格的一部分,并且对于这个函数没有意义 - 如果你想要那个样式,你就不会检查,你只会这样做,并在点上时捕获异常不存在。
然而,即使在这里也有假设 - 你给出了一个有效的观点。对于该点是否存在,该函数返回True / False是正常的,而如果某个不是一个点的东西被传递给它则抛出异常。