code: def check_password(password, encoded, setter=None, preferred='default'):
      
      if password is None:
          return False
  
      preferred = bCryptPasswordHasher
      hasher = bCryptPasswordHasher
  
      hasher_changed = hasher.algorithm != preferred.algorithm
      must_update = hasher_changed or preferred.must_update(encoded)
      is_correct = hasher.verify(password, encoded)
  
      # If the hasher didn't change (we don't protect against enumeration if it
      # does) and the password should get updated, try to close the timing gap
      # between the work factor of the current encoded password and the default
      # work factor.
      if not is_correct and not hasher_changed and must_update:
          hasher.harden_runtime(password, encoded)
  
      if setter and is_correct and must_update:
          setter(password)
      return is_correct
docs: Return a boolean of whether the raw password matches the three
      part encoded digest.
      If setter is specified, it'll be called when you need to
      regenerate the password.