我是编程新手,但仍在尝试确定此处的逻辑。
我正在使用python-gnupg模块。我认为有一个函数“ list_keys()可以返回字典列表。
>>> gpg.list_keys()
[{'type': 'pub', 'trust': '-', 'length': '4096', 'algo': '1', 'keyid': '1234', 'date': '1234', 'expires': '', 'dummy': '', 'ownertrust': '-', 'sig': '', 'uids': ['john doe <john@doe.com>'], 'sigs': [], 'subkeys': [['1234', 'e', '1234']], 'fingerprint': 'abc1234'}]
我遍历并枚举列表:
for c, key in enumerate(all_keys):
print('{}. {}'.format(c, key['uids']))
# Loop returns
0. ['jane doe jane@doe.com']
1. ['jane doe jane@doe.com']
现在我想接受数字输入并将其转换为关联的键/ uid:
choice = int(input("Choose key: "))
# How do I translate from enumerated number list to its key?
# What does this do?
if choice in gpg.list_keys():
choice = all_keys[choice][key]
我是否需要让循环为每个枚举结果生成一个列表?我不确定哪些是正确的问题,也不能完全理解这里的逻辑。
目标是输入一个数字,将该数字转换为用户ID,然后检查字典中是否存在该用户ID。
非常感谢指导。我应该问什么问题?
答案 0 :(得分:1)
由于您已经标记了Python 3.6,所以我不建议您依赖两次调用之间的字典顺序是相同的。您可以将编号映射到GPG键作为另一个字典,并且由于dict
具有constructor from an iterable of pairs,因此这是
非常简单:
enumerated_keys = dict(enumerate(all_keys)) # {0: {'type': 'pub', ...}, 1: {'type': 'pub', ...}}
print('\n'.join('{}. {}'.format(c, k['uids']) for c, k in enumerated_keys.items())) # matches your output format
choice = int(input("Choose key: "))
try:
print(enumerated_keys[choice])
except KeyError:
print("Invalid option!")
我认为这里的主要思想是先创建映射“用户选择-> GPG密钥”,然后再将其呈现给用户。在您的代码中,您不会将enumerate
的结果保存在任何地方,这显然使以后很难使用它。
答案 1 :(得分:1)
我修改了代码,因此对我来说很有意义(如果我正确理解了这个问题):
all_keys = gpg.list_keys()
for c, key in enumerate(all_keys):
print('{}. {}'.format(c, key['uids']))
choice = int(input("Choose key: "))
# What does this do?
if choice in all_keys:
choice = all_keys[choice]['keyid']
choise
是用户提供的任何可能的整数。首先要做的是验证choice
可能是列表all_keys
的索引
if内的第二行采用相应的字典all_keys[choice]={'type': 'pub', 'trust': '-', 'length' ...}
,在此字典中采用键keyid
的值。然后choice
将是ID 1234