我对散列的Django实现有疑问。它们全部实现verify
方法,并且正在执行assert algorithm == self.algorithm
。
我知道可以通过将标志-O
传递给生产代码上的Python解释器来禁用断言。
例如,BCryptSHA256PasswordHasher
像这样实现verify
:
def verify(self, password, encoded):
algorithm, salt, hash = encoded.split('$', 2)
assert algorithm == self.algorithm
encoded_2 = self.encode(password, salt)
return constant_time_compare(encoded, encoded_2)
assert
语句仅在开发阶段使用吗?还是有其他原因?
答案 0 :(得分:1)
多年来,我也逐渐在代码中添加断言,与此类似。
以这种方式使用时,使您的代码引发AssertionError
而不是某些副作用(导致无法满足预期条件)会加快调试速度。
我个人认为这些asserts
不会投入生产,但这是根据个人用例以及代码的使用,维护方式等做出的选择。< / p>
答案 1 :(得分:0)
asserts不应在生产中使用,取决于代码是否针对生产进行了优化。
断言从pyo文件中剥离了一些结果是测试的代码未部署(如果已优化)。这可能会使开发人员没有意识到谁正在使用断言来引发并阻止开发中的进一步执行以保护上游调用。这在生产中将不受保护。