3

もっと簡単な機能で再現しようとしましたが、うまくいきませんでした。したがって、次のコードは、本番サーバーによってスローされるKeyErrorに関連するメソッドを示しています。

class PokerGame:
...
    def serialsNotFold(self):
        return filter(lambda x: not self.serial2player[x].isFold(), self.player_list)

    def playersNotFold(self):
        return [self.serial2player[serial] for serial in self.serialsNotFold()]
...

そして、これがトレースバックです。

Traceback (most recent call last):
  File "/usr/lib/python2.6/dist-packages/pokernetwork/pokertable.py", line 945, in update
    try: self.game.historyReduce()
  File "/usr/lib/python2.6/dist-packages/pokerengine/pokergame.py", line 3949, in historyReduce
    self.turn_history = PokerGame._historyReduce(self.turn_history,self.moneyMap())
  File "/usr/lib/python2.6/dist-packages/pokerengine/pokergame.py", line 1323, in moneyMap
    money = dict((player.serial,player.money) for player in self.playersNotFold())
  File "/usr/lib/python2.6/dist-packages/pokerengine/pokergame.py", line 3753, in playersNotFold
    return [self.serial2player[serial] for serial in self.serialsNotFold()]
KeyError: 21485L
  • self.player_listは、雑誌のリストです
  • self.serial2playerは、シリアルをPlayerオブジェクトにマップするdictです。

これで、playersNotFoldでKeyErrorが発生する可能性はありません。したがって、serialsNotFoldでも同じエラーが発生する必要がありますが、発生しません。

私は2人の仲間と#pythonの人たちに尋ねましたが、これがどのように起こるのか誰も推測することができませんでした。

完全なソースが必要な場合:https ://github.com/pokermania/poker-network/

編集: 問題は、下からではなく上から制限するtraceback.format_exc(limit = 4)を出力したことでした。最後の2つの呼び出しは非表示になっているため、playersNotFoldが例外を発生させたように見えました。

これが完全なトレースです。

Traceback (most recent call last): 
  File "/usr/lib/python2.7/pokernetwork/pokertable.py", line 704, in update 
    try: self.game.historyReduce() 
  File "/usr/lib/python2.7/pokerengine/pokergame.py", line 3953, in historyReduce 
    self.turn_history = PokerGame._historyReduce(self.turn_history,self.moneyMap()) 
  File "/usr/lib/python2.7/pokerengine/pokergame.py", line 1327, in moneyMap 
    money = dict((player.serial,player.money) for player in self.playersNotFold()) 
  File "/usr/lib/python2.7/pokerengine/pokergame.py", line 3757, in playersNotFold 
    return self.serial2player[serial] for serial in self.serialsNotFold()] 
  File "/usr/lib/python2.7/pokerengine/pokergame.py", line 3754, in serialsNotFold 
    return filter(lambda x: not self.serial2player[x].isFold(] self.player_list) 
  File "/usr/lib/python2.7/pokerengine/pokergame.py", line 3754, in <lambda> 
    return filter(lambda x: not self.serial2player[x].isFold(] self.player_list) 
KeyError: 1521

時間を無駄にしてすみません:/

4

1 に答える 1

0

スレッドを使用していると思いますが、self.serial2playerは別のスレッドによって変更されます。

于 2012-05-09T14:49:17.920 に答える