def next()for Python pre-2.6?(而不是object.next方法)

beh*_*all 5 python next

Python 2.6+和3.*有next(),但2.6之前只提供了object.next方法.有没有办法在2.6之前获得next()样式; 一些"def next():"建筑也许?

小智 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
Run Code Online (Sandbox Code Playgroud)

(throw = object()作品太多,但这种检查时产生更好的文档,例如help(next),None是不适合的,因为你必须把next(it)next(it, None)不同.)


Ned*_*der 6

R. Pate似乎有一个很好的答案.要添加一个额外的响铃:如果您正在编写代码以在许多不同版本的Python上运行,则可以对该定义进行条件化:

try:
    next = next
except NameError:
    def next():
        # blah blah etc
Run Code Online (Sandbox Code Playgroud)

这种方式next在任何情况下都已定义,但您正在使用可用的内置实现.

我使用next = next这样我可以把这个定义放在一个模块中,然后在我的代码使用的其他地方:

from backward import next
Run Code Online (Sandbox Code Playgroud)