使用变量作为键创建Python字典出现KeyError,求排查原因
问题分析与解决方案
咱们来一步步拆解这个问题,为什么会抛出KeyError,以及怎么修复它:
1. 最核心的问题:传入的是变量值,不是变量名
你调用create_dict(a, d)的时候,传递给函数的是变量a和d的实际值(也就是"Some Text"和当前的datetime对象),而不是变量名的字符串"a"、"d"。
函数里的locals()[i]试图在局部作用域里找以i为键的变量,但i现在是"Some Text"和那个时间对象,局部作用域里根本没有叫这个名字的变量,自然就抛出KeyError了。
2. 第二个问题:函数没有返回创建的字典
就算前面的问题解决了,你的create_dict函数里只是创建了字典,但没有用return返回它,调用后也拿不到预期的字典结果。
3. 额外问题:日期格式不符合预期
你预期的字典里日期是04-06-2018这种字符串格式,但datetime.now()返回的是datetime对象,直接存进去不会自动转换格式,需要用strftime手动处理。
修复后的代码
我们可以通过传递变量名字符串,结合全局作用域(因为a和d是函数外定义的全局变量)获取对应的值,同时添加return和日期格式化:
from datetime import datetime a = "Some Text" d = datetime.now().strftime("%d-%m-%Y") # 先把日期格式化为预期的字符串格式 def create_dict(*args): return dict([(i, globals()[i]) for i in args]) # 用globals()取全局变量,同时return字典 result = create_dict("a", "d") # 传入变量名的字符串,不是变量本身 print(result)
执行后就能得到你想要的结果:
{'a': 'Some Text', 'd': '04-06-2018'}
如果需要支持局部变量的场景,可以用inspect模块获取调用者的作用域,但对于当前这个简单场景,用globals()就足够简洁直接了。
内容的提问来源于stack exchange,提问作者reservoirinvest
相关产品推荐
相关产品推荐

