我正在试图弄清楚是否存在将字符串转换为字典位置的预建方式。我认为示例代码最容易解释我正在尝试做什么。
def main(locate_user_id):
response = {
"users": [{
"id": 1,
"name": "Joe"
}, {
"id": 2,
"name": "Bob"
}]
}
print(response)
print (locate_user_id)
print (response[locate_user_id])
if __name__ == "__main__":
main("users[1]['id']")
目前的输出是:
{'users': [{'id': 1, 'name': 'Joe'}, {'id': 2, 'name': 'Bob'}]}
users[1]['id']
Traceback (most recent call last):
File "test_dict.py", line 17, in <module>
main("users[1]['id']")
File "test_dict.py", line 14, in main
print (response[locate_user_id])
KeyError: "users[1]['id']"
我正在寻找一种能够输出这个的解决方案:
{'users': [{'id': 1, 'name': 'Joe'}, {'id': 2, 'name': 'Bob'}]}
users[1]['id']
2 // the id of the user referenced above
答案 0 :(得分:0)
使用ast.literal_eval
:
>>> import ast
>>> ast.literal_eval{PUT YOUR LIST HERE}
答案 1 :(得分:0)
我认为这样做会有所帮助。有点脏,但它有效!
def main(locate_user_id):
response = {
"users": [{
"id": 1,
"name": "Joe"
}, {
"id": 2,
"name": "Bob"
}]
}
print(response)
print(locate_user_id)
keys = locate_user_id.replace(']','').split('[')
keys[0] = '"' + keys[0] + '"'
eval_str = '[' + ']['.join(keys) + ']'
print(eval(str(response) + eval_str))
if __name__ == "__main__":
main("users[1]['id']")
答案 2 :(得分:0)
不使用eval
,只需略微修改输入,就可以使用能够评估下标访问权限的str.format
来实现您想要的效果,而不必使用邪恶的eval
:
def main(locate_user_id):
response = {
"users": [{
"id": 1,
"name": "Joe"
}, {
"id": 2,
"name": "Bob"
}]
}
print(("{"+locate_user_id+"}").format(response))
if __name__ == "__main__":
main("[users][1][id]") # instead of "users[1]['id']"
结果:2
答案 3 :(得分:-2)
字符串是一个字符串。您需要Python解释器才能理解Python语法。要在脚本范围内调用解释器,可以使用eval
。
您需要对脚本进行轻微修改,eval
才能按您希望的方式工作:
def main(locate_user_id):
response = {
"users": [{
"id": 1,
"name": "Joe"
}, {
"id": 2,
"name": "Bob"
}]
}
print(eval('response' + locate_user_id))
if __name__ == "__main__":
main("['users'][1]['id']")
这是在评估函数response['users'][1]['id']
范围内的字符串main
。
无论使用何种用例,都不建议使用eval
,原因可能是Google。我会尝试重构您的代码,以便不必使用eval
。