我一直得到最奇怪的关键错误'在生产中运行我的脚本时。这很奇怪,因为在开发过程中我没有收到任何错误。
我创建了一个' try-except'阻止捕获错误,但字典似乎一切正常。没有密钥丢失。这很奇怪,因为有时for循环挂在它的中间,或者有时抛出异常(即使它是完全相同的输入)。
我使用的是Python 3.4,机器之间的区别是:
以下是我的代码的过度简化。我的真正的类有26个属性,其中两个是动态生成的HTML SVG代码。此外,词典列表的长度可以是0到100之间的任何内容(在开发中我使用较小的词典列表(即10)):
class myObject(object):
self.id = id
self.alias = alias
def get_me_objects(list_of_dicts):
try:
objects_list = []
print('Entering the faulty for loop...')
for i in range(len(list_of_dicts)):
id = list_of_dicts[i]['id']
alias = list_of_dicts[i]['alias']
obj = myObject(id, alias)
print('obj.id:' + str(print(obj.id)))
print('len(obj.__dict__):' + str(len(obj.__dict__)))
objects_list.append(obj)
except:
print('')
print('The following exception ocurred:')
e = sys.exc_info()[0]
print(e)
print('obj.id:' + str(obj.id))
print('len(obj.__dict__):' + str(len(obj.__dict__)))
print('obj.___dict__:' + str(obj.__dict__))
print('')
print('Returning objects_list')
print(objects_list)
return objects_list
当我以此作为输入运行时:
get_me_objects([{'id': 1009, 'alias': 'b'}, {'id': 8888, 'alias': 'c'}, {'id': 7778, 'alias': 't'}]
.... 趋向给我这个输出......
Entering the faulty for loop...
obj.id: 1009
len(obj.__dict__): 2
obj.id: 8888
len(obj.__dict__): 2
The following exception ocurred:
<class 'KeyError'>
obj.id: 8888
len(obj.__dict__): 2
obj.___dict__: {'alias': 'c', 'id': 8888}
Returning objects_list
[<app.views.my_scripts.MyObject object at 0x7f9c4c464198>, <<app.views.my_scripts.MyObject object at 0x7f9c4c46db38>]
...如果我再次重试,它有时会给我这个输出(即使有相同的词典列表!)...
Entering the faulty for loop...
...奇怪的是,如果我有时再次重试它可以给我这个输出(即使有完全相同的词典列表!):
Entering the faulty for loop...
obj.id: 1009
len(obj.__dict__): 2
The following exception ocurred:
<class 'KeyError'>
obj.id: 1009
len(obj.__dict__): 2
obj.___dict__: {'alias': 'a', 'id': 1009}
Returning objects_list
[<app.views.my_scripts.MyObject object at 0x7f9c4c464198>]
所以我怀疑这个问题与CPU电脑电源有关。或者也许在某个地方存在一个问题,在我的生活中,我无法看到它。我还能做些什么来解决这个问题?
更新1.0
Rob提出了一个重要的观点,要求我删除try-except块以查看完整的回溯。我添加try-except块的原因是因为Gunicorn没有向我展示任何东西。一旦找到获得追溯的方法,我就会立即更新我的帖子。
更新2.0
按照Rob的建议我检查回溯(很明显!),发现有一个有效的KeyError来自另一个函数,它来自for循环。它没有被注意到,因为首先,功能的名称伪装成类似的变量名称,其次,由于看似随机的&#39;而我严重分心。我一直从字典中得到的行为:
'In what order does python display dictionary keys?'):
订单与内部工作方式以及它们在哈希表中的结束顺序有关。这又取决于密钥哈希值,它们的插入顺序以及您正在使用的Python实现。
顺序是任意的(但不是随机的),知道它将是哪个顺序永远不会有用。
要获取按键的排序列表,只需使用已排序(D),在您的情况下将返回[&#39; a&#39;,&#39; b&#39;,&#39; c&#39 ]。
我的坏。无论如何,感谢大家的帮助!
答案 0 :(得分:1)
按照Rob的建议,我检查了追溯(呃!),发现有一个有效的KeyError来自另一个函数,来自for循环。
这个错误没有引起注意(对我来说无论如何)因为首先,函数的名称伪装成类似的变量名称,其次,我期待看到Gunicorn输出中的追溯(但它没有发生) ),第三,我因为看似随意的而感到非常分心。我一直从字典中获取的行为。提醒:
'In what order does python display dictionary keys?'
订单与内部工作方式以及它们在哈希表中的结束顺序有关。这又取决于密钥哈希值,它们的插入顺序以及您正在使用的Python实现。
顺序是任意的(但不是随机的),知道它将是哪个顺序永远不会有用。
要获取按键的排序列表,只需使用已排序(D),在您的情况下将返回[&#39; a&#39;,&#39; b&#39;,&#39; c&#39 ]。