itertools.combinations関数で生成された iterator でlist関数を呼び出してリストを作成すると、次のようなエラーが発生することがあります。
*** Error in argument: '(combinations(aDict,2))'
しかし、 print、len、またはisinstance関数で同じリストを呼び出すと、期待どおりに機能します。
最初はスクリプトでこの動作を取得しましたが、pdb を使用して最も確実に再現できたので、コード例では、sript でset_traceを呼び出してからインタープリターで入力する必要があります。
from itertools import combinations
aDict={'a':1,'b':2,'c':3}
print(len(list(combinations(aDict,2))))
print(isinstance(list(combinations(aDict,2)),list))
print(list(combinations(aDict,2)))
len(list(combinations(aDict,2)))
isinstance(list(combinations(aDict,2)),list)
list(combinations(aDict,2))
print('Hello')
import pdb
pdb.set_trace()
次に、インタープリターで次のコマンドを入力します。
>>> ================================ RESTART ================================
>>>
3
True
[('a', 'b'), ('a', 'c'), ('b', 'c')]
Hello
--Return--
> c:\sw_dev\00_draft_development\02_scade\a429test\test_value_generator\pdbcomb.py(15)<module>()->None
-> pdb.set_trace()
(Pdb) len(list(combinations(aDict,2)))
3
(Pdb) isinstance(list(combinations(aDict,2)),list)
True
(Pdb) list(combinations(aDict,2))
*** Error in argument: '(combinations(aDict,2))'
(Pdb) len(list(combinations(aDict,2)))
3
(Pdb)
だから私の質問は、エラーの原因は何ですか?同じコマンドをlenの引数としてラップすると、エラーが発生しないのはなぜですか?
(私は 64 ビット Intel マシンで Windows 7 上で python 3.3.1 を実行しています)