2016-11-17 15 views
-1

私は、iter関数を持つあらかじめ作られた非標準のPython標準辞書を反復するシステムを設計しています。私はタプルを反復しようとしていますが、この愚かなエラーを続けています。また、このエラーが唯一の原因おそらく入力Pythonはタプルで辞書を繰り返します

TypeError: 'tuple' object cannot be interpreted as an integer 

簡単な修正で台無し機能を反転ビットに、半分の時間に発生し、誰もが見つけることができますか?

HERESに関連するコード:私のメインプログラムで

for tup in crusherdict.CrusherDict(db2, fields[0]): 
    log.write("VOTE\t{}\t{}\n".format(tup[0][0], tup[0][1])) 

私にITERのエラーを与えて辞書で場所:

def __iter__(self): 

     for i in range(self.__len__()): 
      yield self.db.fetch(entryName(self.name,i)) 

相続人db.fetch:

def fetch(self,key): 
    return self.cache[key] 

およびentr ynameの名前:

def entryName(dict, str): 
    return (dict, "E", str) 

のフルバックトレース:

in <module> 
if commands[line[0]](db, tempDict, logFile, line): 

in cast 
return inq(db, tempDict, logFile, ("INQ", tempDict["voterID"])) 

line 100, in inq 
for tup in crusherdict.CrusherDict(db3, fields[0]): 

crusherdict.py", line 91, in __iter__ 
for i in range(self.__len__()): 
TypeError: 'tuple' object cannot be interpreted as an integer 
>>> 
+0

これは*関連コード*ではありません。 [mcve]と完全なトレースバックを与えてください。 – jonrsharpe

+0

完全なバックトレースを表示できますか? TypeErrorがどこから来ているのかわかりません。 –

+0

なお、 'self .__ len __()'は書かないでください。 'len(self)'と書くだけで、それは '__len__'の目的です。 – alexis

答えて

0

トレースバックエラーがで起こる言う:

for i in range(self.__len__()): 

私たちは、これは期待しているので、rangeは整数を期待し、そして実際に私達ができることを知っていますPython 3でエラーメッセージを複製する:

>>> range((1,2)) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError: 'tuple' object cannot be interpreted as an integer 

したがって、__len__は整数を返しません。

+0

@SeanJean私は従いません。あなたは '__len__'からタプルを返すようにしたいのですが、何とかタプルを範囲に入れますか?それらのどちらが意味するのか分かりません。 –

0

あなたの関数entryName()は、3つの要素のタプルを返します。このタプルは、キャッシュへのインデックスとしてfetchによって使用されます。あなたが提供するビットから推測する必要があるので、あなたのキャッシュは単純なリストであり、タプルではなく整数インデックスが必要であると推測しています。 (また、という名前の引数にintを渡しているので、ここではっきりと混同しています。)

+0

しかし、メッセージは 'TypeError:リストインデックスはタプルではなく整数またはスライスでなければなりません。 ' –

+0

あなたは正しいです...明らかに、このステートメントに入る前にコードがクラッシュします。このような質問の問題は、間違いが1つしかないということです。それを楽しみましょう。 – alexis

関連する問題