5

Django投票パッケージを使用していて、シェルでget_top()メソッドを使用すると、「0x022f7AD0のジェネレーターオブジェクト」のようなものが返されます。これまでにこのようなものを見たことがありません。どのようにアクセスしますか?

私のコード:

v=Vote.objects.get_top(myModel, limit=10, reversed=False)
print v
<generator object at 0x022f7AD0>

注意:get_topはmyModelの素敵なリストを返すだけだと思いました。これは、v.nameなどのようなことができます。

4

3 に答える 3

20

リストが必要な場合は、ジェネレータオブジェクトでlist()を呼び出すだけです。

Pythonのジェネレーターオブジェクトは、レイジーリストのようなものです。要素は、それらを反復処理するとすぐに評価されます。(したがって、その上の呼び出しリストはそれらすべてを評価します。)

たとえば、次のことができます。

>>> def f(x):
...  print "yay!"
...  return 2 * x
>>> g = (f(i) for i in xrange(3))    # generator comprehension syntax
>>> g
<generator object <genexpr> at 0x37b6c0>

>>> for j in g: print j
... 
yay!
0
yay!
2
yay!
4

fを反復処理するときにのみ、fがどのように評価されるかを確認してください。このトピックに関する優れた資料は、http ://www.dabeaz.com/generators/にあります。

于 2009-04-22T07:55:01.230 に答える
7

ジェネレータは一種のイテレータです。イテレータは一種のイテレータオブジェクトであり、他のイテレータと同様に、

forループを使用して、すべてのアイテムを反復処理できます。

for vote in Vote.objects.get_top(myModel, limit=10, reversed=False):
    print v.name, vote

インデックスでアイテムにアクセスする必要がある場合は、リストに変換できます。

top_votes = list(Vote.objects.get_top(myModel, limit=10, reversed=False))
print top_votes[0]

ただし、イテレータの特定のインスタンスを1回だけ反復できます(リストなどのより一般的な反復可能なオブジェクトとは異なります)。

>>> top_votes_generator = Vote.objects.get_top(myModel, limit=3)
>>> top_votes_generator
<generator object at 0x022f7AD0>
>>> list(top_votes_generator)
[<Vote: a>, <Vote: b>, <Vote: c>]
>>> list(top_votes_generator)
[]

独自のジェネレーターの作成の詳細については、http://docs.python.org/tutorial/classes.html#generatorsを参照してください。

于 2009-04-22T08:11:20.923 に答える
1

うーん

私はこれを読みました、そしてこれと物事は今静かにはっきりしています。

実際、私はジェネレーターをリストに変換することができます

mylist=list(myGenerator)
于 2009-04-22T08:10:28.523 に答える