You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将异常作为预期结果的写法有多不符合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:03:10