code: async def _get_keys(ui, encrypt_keyids, block_error=False, signed_only=False):
      
      keys = {}
      for keyid in encrypt_keyids:
          try:
              key = crypto.get_key(keyid, validate=True, encrypt=True,
                                   signed_only=signed_only)
          except GPGProblem as e:
              if e.code == GPGCode.AMBIGUOUS_NAME:
                  tmp_choices = ['{} ({})'.format(k.uids[0].uid, k.fpr) for k in
                                 crypto.list_keys(hint=keyid)]
                  choices = {str(i): t for i, t in enumerate(tmp_choices, 1)}
                  keys_to_return = {str(i): t for i, t in enumerate([k for k in
                                    crypto.list_keys(hint=keyid)], 1)}
                  choosen_key = await ui.choice("ambiguous keyid! Which " +
                                                "key do you want to use?",
                                                choices=choices,
                                                choices_to_return=keys_to_return)
                  if choosen_key:
                      keys[choosen_key.fpr] = choosen_key
                  continue
              else:
                  ui.notify(str(e), priority='error', block=block_error)
                  continue
          keys[key.fpr] = key
      return keys
docs: Get several keys from the GPG keyring.  The keys are selected by keyid
      and are checked if they can be used for encryption.
  
      :param ui: the main user interface object
      :type ui: alot.ui.UI
      :param encrypt_keyids: the key ids of the keys to get
      :type encrypt_keyids: list(str)
      :param block_error: wether error messages for the user should expire
          automatically or block the ui
      :type block_error: bool
      :param signed_only: only return keys whose uid is signed (trusted to belong
          to the key)
      :type signed_only: bool
      :returns: the available keys indexed by their OpenPGP fingerprint
      :rtype: dict(str->gpg key object)