在普通代码中使用断言
Use assert in normal code
我正在编写一个 python 函数来验证来自电子邮件的令牌。在电子邮件中,有一个 url 及其端点。我有两个 url 参数,令牌和电子邮件地址。在我的端点,我必须检查:
- 如果参数在URL
- 如果数据库中有关联令牌
- 如果对应用户邮箱
- 如果令牌仍然有效(2 天后过期)
- 如果已经使用过
我选择将所有这些检查包装在一个 try except
块中,我将始终 return 相同的错误 "invalid 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
我喜欢我这样做的方式,因为它超级干净。
这是一个好习惯吗?这个问题还有其他解决方案吗?
不,使用 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
,例如if condition: raise TypeError
.
我正在编写一个 python 函数来验证来自电子邮件的令牌。在电子邮件中,有一个 url 及其端点。我有两个 url 参数,令牌和电子邮件地址。在我的端点,我必须检查:
- 如果参数在URL
- 如果数据库中有关联令牌
- 如果对应用户邮箱
- 如果令牌仍然有效(2 天后过期)
- 如果已经使用过
我选择将所有这些检查包装在一个 try except
块中,我将始终 return 相同的错误 "invalid 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
我喜欢我这样做的方式,因为它超级干净。 这是一个好习惯吗?这个问题还有其他解决方案吗?
不,使用 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
,例如if condition: raise TypeError
.