我是编程新手,仍然在尝试识别这里的逻辑。
我正在使用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]
我需要让循环为每个枚举结果生成一个列表吗?我不确定哪些是正确的问题,也不完全掌握这里的逻辑。
目标是输入一个数字,将该数字转换为user-id,并检查该user-id是否存在于字典中。
非常感谢您的指导。我应该问些什么问题?
发布于 2018-08-06 03:18:13
由于您已经标记了Python3.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!")
我认为这里的主要思想是首先创建映射"user choice -> GPG key",然后才将其呈现给用户。在您的代码中,您没有保存来自enumerate
anywhere的结果,这显然使以后很难使用它。
发布于 2018-08-06 03:36:14
我修改了代码,以便它对我有意义(如果我正确理解了问题的话):
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
。
https://stackoverflow.com/questions/51697398
复制相似问题