这是我老板的代码:
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()
我是对的吗?
答案 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%确定此值永远不会为空,请随时退出检查,但请考虑未来的开发。