是否有必要在我老板的django代码中进行所有这些检查?

时间:2011-03-10 03:59:05

标签: python django

这是我老板的代码:

if hasattr(request, 'rk_user') and request.rk_user:
            request.rk_user.focus_update()

但我认为没有必要同时检查

我认为它应该是:

if hasattr(request, 'rk_user') :
            request.rk_user.focus_update()

或:

if  request.rk_user:
            request.rk_user.focus_update()

我是对的吗?

3 个答案:

答案 0 :(得分:7)

虽然其他回答者是正确的,他们检查不同的东西,你可以将两个支票折叠成一个命令:

if getattr(request, 'rk_user', None):

如果存在属性,则获取该属性,如果不存在,则获取None;然后它检查它得到的任何值都不是空的。

答案 1 :(得分:3)

他们检查不同的东西。一个检查以确保访问request.rk_user不会失败(hasattr)而另一个检查它不是某些False - 类似类型,很可能是None(后一部分)有条件的)。如果他真的想要采取谨慎的编程风格,他可以这样做:

if hasattr(request, `rk_user`) and request.rk_user \
  and hasattr(request.rk_user, 'focus_update') \
  and callable(request.rk_user.focus_update):
    request.rk_user.focus_update()

但这只是愚蠢和繁重,这就是为什么更多的Pythonic风格只是试图处理异常。它甚至有一个首字母缩略词,EAFP(比请求更容易请求宽恕),它是in the Python glossary

所以,你们两个都没有比另一个更正确。如果您希望request没有该属性的常见情况,请继续检查。如果有些情况下即使它具有该属性,有时也是None,那么它可能值得检查它。但是你不会真正用任何条件覆盖所有你的基础或异常潜在路径,所以只检查你可能合理期望发生的事情并有逻辑来处理。

答案 2 :(得分:1)

看起来rk_user是请求模型上的自定义属性?你绝对应该包含hasattr if块。和另外一个。你的老板有正确的代码。

修改
我假设这可以为null,您实际上希望代码正确处理该条件。当然,如果您100%确定此值永远不会为空,请随时退出检查,但请考虑未来的开发。