code: def load_private_key(source, password=None):
      
  
      if isinstance(source, keys.PrivateKeyInfo):
          private_object = source
  
      else:
          if password is not None:
              if isinstance(password, str_cls):
                  password = password.encode('utf-8')
              if not isinstance(password, byte_cls):
                  raise TypeError(pretty_message(
                      '''
                      password must be a byte string, not %s
                      ''',
                      type_name(password)
                  ))
  
          if isinstance(source, str_cls):
              with open(source, 'rb') as f:
                  source = f.read()
  
          elif not isinstance(source, byte_cls):
              raise TypeError(pretty_message(
                  '''
                  source must be a byte string, unicode string or
                  asn1crypto.keys.PrivateKeyInfo object, not %s
                  ''',
                  type_name(source)
              ))
  
          private_object = parse_private(source, password)
  
      return _load_key(private_object)
docs: Loads a private key into a PrivateKey object
  
      :param source:
          A byte string of file contents, a unicode string filename or an
          asn1crypto.keys.PrivateKeyInfo object
  
      :param password:
          A byte or unicode string to decrypt the private key file. Unicode
          strings will be encoded using UTF-8. Not used is the source is a
          PrivateKeyInfo object.
  
      :raises:
          ValueError - when any of the parameters contain an invalid value
          TypeError - when any of the parameters are of the wrong type
          oscrypto.errors.AsymmetricKeyError - when the private key is incompatible with the OS crypto library
          OSError - when an error is returned by the OS crypto library
  
      :return:
          A PrivateKey object