为什么 django hashers 使用断言?

Why django hashers are using assert?

我有一个关于散列器的 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语句是不是只能在开发阶段使用?还是有其他原因?

这些年来,我也开始在我的代码中添加断言,类似于此。

像这样使用时,让您的代码引发 AssertionError 而不是导致不满足预期条件的一些副作用错误可以帮助加快调试速度。

就我个人而言,我认为这些 asserts 投入生产没有问题,但这是根据个人用例以及代码的使用和维护方式等做出的选择.

不应在生产中使用断言,这取决于代码是否针对生产进行了优化。

断言从 pyo 文件中剥离出来结果是测试的代码未部署(如果优化)。这可能会让开发人员没有意识到谁在使用断言来引发和阻止开发中的进一步执行以保护上游调用。这在生产中不受保护。