将异常作为预期结果的写法有多不符合Python风格?(Django场景代码评估)
将异常作为预期结果的写法有多不符合Python风格?(Django场景代码评估)
嘿,咱们先唠唠你这段Django代码的事儿~ 先给你的写法打个3/10的“犯罪分”——算不上重罪,但确实是个不够优雅的小瑕疵,算不上Pythonic的最佳实践。
为啥这么说呢?Python圈里确实有个“请求原谅比请求许可更容易(EAFP)”的风格,但这个原则的适用场景是异常情况极少发生的情况,比如访问字典里可能不存在的键,这时候捕获KeyError比先判断key是否存在更高效。但你这儿的情况不一样:“用户重复提交”是一个完全预期内的业务场景,属于正常的逻辑分支,而非意外的异常状况。
你现在的写法是通过捕获DoesNotExist异常来走“未提交过”的分支,这会让代码的意图变得不那么直观——其他开发者读代码的时候,第一眼可能会以为你是在尝试获取一个“理应存在”的对象,捕获异常是处理意外情况,而不是用来判断用户是否重复提交。
更合适的写法应该直接用exists()方法来做条件判断,逻辑一目了然:
if models.MyModel.objects.filter(id=instance_id, user=request.logged_in_user).exists(): return HttpResponseBadRequest("Already submitted") # 继续后续逻辑
这种写法的好处是:
- 可读性拉满,谁看都知道你是在检查“用户是否已经提交过”
- 符合“先判断再执行”的正常逻辑流,不需要绕到异常分支里理解业务意图
- 在性能上也和你的原写法差不多,Django的
exists()会生成更轻量的SQL查询(只查是否存在,不返回完整对象)
总的来说,你的代码能跑,也不会出啥大问题,但确实可以更优雅一点~
备注:内容来源于stack exchange,提问作者Omroth
相关产品推荐
相关产品推荐

