Skip to main content
 首页 » 编程设计

python之在普通代码中使用断言

2025年05月04日26myhome

我正在编写一个 python 函数来验证电子邮件中的 token 。在电子邮件中,有一个带有端点的 url。我有两个 url 参数, token 和电子邮件地址。在我的端点,我必须检查:

  • 如果参数在URL中
  • 如果数据库中有关联 token
  • 如果对应用户邮箱
  • 如果 token 仍然有效(2 天后过期)
  • 如果已经使用过

我选择将所有这些检查包装在 try except block 中,我将始终返回相同的错误“无效 token ”,因此我不必精确检查单个错误。我使用了 assertFalse 和 assertEqual 函数,如果它不正确就会引发异常。

try: 
    # pull from url 
    email = request.GET['email'] 
    value_token = request.GET['token'] 
    # test if valid 
    token = EmailValidationToken.objects.get(token=value_token) 
    assertFalse(token.consumed) 
    assertEqual(email, token.user.email) 
    assertFalse(token.is_expired()) 
except: 
    pass # return error 

我喜欢我这样做的方式,因为它 super 干净。 这是一个好习惯吗?这个问题还有其他解决方案吗?

请您参考如下方法:

不,使用 assert 控制流而不是调试是不好的做法,因为可以关闭断言。只需使用普通的 if 语句即可。

# pull from url 
email = request.GET['email'] 
value_token = request.GET['token'] 
# test if valid 
token = EmailValidationToken.objects.get(token=value_token) 
if token.consumed or email != token.user.email or token.is_expired(): 
    pass # return error 

如果您绝对坚持通过引发错误来控制程序的流程(在某些情况下这是有效的做法),请使用 raise 来实现,例如如果条件:引发 TypeError。