为什么 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 文件中剥离出来结果是测试的代码未部署(如果优化)。这可能会让开发人员没有意识到谁在使用断言来引发和阻止开发中的进一步执行以保护上游调用。这在生产中不受保护。
我有一个关于散列器的 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 文件中剥离出来结果是测试的代码未部署(如果优化)。这可能会让开发人员没有意识到谁在使用断言来引发和阻止开发中的进一步执行以保护上游调用。这在生产中不受保护。