2016-03-25 8 views
2

本番環境でスクリプトを実行すると、私は最も奇妙な「KeyError」を得ています。私は開発中に何の誤りもないので奇妙です。PythonはランダムKeyErrorをスローします。それは計算力の欠如かもしれませんか?

私はエラーをキャッチするために 'try-except'ブロックを作成しましたが、すべてが辞書で正しいと思われます。キーがありません。場合によってはforループが途中でハングすることがあり、まったく同じ入力であっても例外をスローすることがあるため、奇妙です。

私は、Python 3.4を使用していますし、マシン間の相違点は次のとおりです。

  • 生産(AWS」EC2マイクロインスタンス)のみ1 CPU(CPU0)と1ギガバイト RAMを使用し、3人のGunicornの労働者を使用しています。
  • 開発マシンには3つのCPU(CPU0、CPU1、CPU2)、1GBのRAMがあり、3人のGuniornワーカーを使用します(最大9つまで可能です)。

以下は私のコードを単純化したものです。私の実際のクラスは26の属性を持ち、そのうちの2つは動的に生成されたHTML SVGコードを受け取ります。また、辞書のリストのな長さは、0から100まで何かを持つことができます(開発中で、私はdicionaries(すなわち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のコンピュータ電源と関係していると思う。または、私の人生の間、私はそれを見ることができない、どこかに横たわっている問題があるかもしれません。この問題のトラブルシューティングには他に何ができますか?

UPDATE 1.0

ロブは、完全なトレースバックを参照してみてください-除くブロックを削除するために私を求め、重要なポイントを作りました。私がtry-exceptブロックを追加したのは、Gunicornが何も表示していなかったからです。私はトレースバックを取得する方法を見つけるとすぐに私の投稿を更新します。ロブのアドバイスに従い

UPDATE 2.0

私はトレースバックをチェックし(当然!)とforループ内から呼び出されて別の関数からの有効なKeyError例外がありました。

'In what order does python display dictionary keys?'):

最初ので、ので、私は辞書から得続けるました "一見ランダムな行動の類似した変数名でカモフラージュ、そして第二に、私は真剣に気を取らだの機能の種類の名前を見過ごさ行ってきました

これらの命令は、内部的にどのように動作し、どのような順序でハッシュテーブルに格納されるのかと関係があります。これは、キーのハッシュ値、挿入された順序、使用しているPythonの実装に依存します。

順序は任意です(ランダムではありません)。順序はわかりません。

ソートされたキーのリストを取得するには、sorted(D)を使用します。この場合、あなたのケースでは['a'、 'b'、 'c']が返されます。

悪いです。とにかく皆様のおかげです。

+2

代わりに例外をキャッチしてトレースバック全体を表示してください。あなたの例外メッセージは前の反復から 'obj'を表示するので、役に立たない。 – Rob

+0

フェア、ロブ。 Gunicornが私に何も見せてくれなかったので、私はそうしました。私は何ができるかを見てみましょう、私は私のポストを更新します。 – BringBackCommodore64

+0

'id'フィールドと 'alias'フィールドにアクセスする前に、現在の入力を 'i'の位置に印刷できますか? – Schore

答えて

1

ロブのアドバイスに続いて、トレースバック(duh!)をチェックし、forループ内から呼び出されている別の関数からの有効なKeyErrorがあることがわかりました。

最初に、類似の変数名で偽装された関数名の名前が2番目に、私はGunicornの出力でトレースバックを見ることを期待していたので、間違いが気付かなかった(私にとってはとにかく)第三に、私は真剣に気を散らしました。なぜなら、私は辞書から得ている「一見無作為な」振る舞いのためです。リマインダー:

'In what order does python display dictionary keys?'

順序は、内部で動作し、どのような順序彼らはハッシュテーブル内で終わるどのように関係しています。これは、キーのハッシュ値、挿入された順序、使用しているPythonの実装に依存します。

順序は任意です(ランダムではありません)。順序はわかりません。

ソートされたキーのリストを取得するには、sorted(D)を使用します。この場合、あなたのケースでは['a'、 'b'、 'c']が返されます。

関連する問題