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