5

Python 2.6+ および 3.* には next() がありますが、2.6 より前のバージョンでは object.next メソッドのみが提供されます。2.6 より前のバージョンで next() スタイルを取得する方法はありますか? おそらくいくつかの「def next():」構築?

4

3 に答える 3

11
class Throw(object): pass
throw = Throw() # easy sentinel hack
def next(iterator, default=throw):
  """next(iterator[, default])

  Return the next item from the iterator. If default is given
  and the iterator is exhausted, it is returned instead of
  raising StopIteration.
  """
  try:
    iternext = iterator.next.__call__
    # this way an AttributeError while executing next() isn't hidden
    # (2.6 does this too)
  except AttributeError:
    raise TypeError("%s object is not an iterator" % type(iterator).__name__)
  try:
    return iternext()
  except StopIteration:
    if default is throw:
      raise
    return default

(throw = object()これも機能しますが、これは検査時により良いドキュメントを生成します。たとえば、help(next).は適切ではありNoneません。next(it)next(it, None)

于 2009-11-11T16:39:56.267 に答える
6

R. Pate は良い答えを持っているようです。追加すべきもう 1 つのベル: Python のさまざまなバージョンで実行するコードを作成している場合は、定義を条件付きにすることができます。

try:
    next = next
except NameError:
    def next():
        # blah blah etc

そのようにしてnext、どのような場合でも定義しましたが、利用可能な組み込み実装を使用しています。

next = nextこの定義をモジュールに配置できるように使用し、コードの他の場所で使用します。

from backward import next
于 2009-11-11T16:43:42.240 に答える
2

より簡単な方法:

import operator

next = operator.methodcaller("next")

ブロックに入れることについてのネッドの提案はtryここでも機能しますが、そのルートに行く場合は、1つのマイナーな注意: Python 3 ではnext()、非イテレータを呼び出すと a が発生しますが、TypeErrorこのバージョンではAttributeError代わりに a が発生します。

編集:気にしないでください。steveha が指摘するように、operator.methodcaller()は 2.6 でのみ導入されました。これは残念です。

于 2009-11-11T19:28:02.097 に答える