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)不同.)
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)
| 归档时间: |
|
| 查看次数: |
534 次 |
| 最近记录: |