3

itertools.combinations関数で生成された iterator でlist関数を呼び出してリストを作成すると、次のようなエラーが発生することがあります。

*** Error in argument: '(combinations(aDict,2))'

しかし、 printlen、または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 を実行しています)

4

1 に答える 1

3

listpdbコマンドです:

(Pdb) help list
l(ist) [first [,last]]
List source code for the current file.
Without arguments, list 11 lines around the current line
or continue the previous listing.
With one argument, list 11 lines starting at that line.
With two arguments, list the given range;
if the second argument is less than the first, it is a count.

感嘆符を使用して、行を Python 式として評価します。(Pdb) !list(combinations('abc', 2))

于 2013-05-07T17:02:21.983 に答える