dee*_*pak 15 python python-2.7
为了转换到python 3,我试图理解编写python 2和python 3兼容代码.下面的代码来自python-future.org并说明了构造一个与两个版本的python兼容的迭代器的方法.
from builtins import object
class Upper(object):
def __init__(self, iterable):
self._iter = iter(iterable)
def __next__(self): # Py3-style iterator interface
return next(self._iter).upper() # builtin next() function calls
def __iter__(self):
return self
itr = Upper('hello')
assert next(itr) == 'H' # compatible style
assert list(itr) == list('ELLO')
Run Code Online (Sandbox Code Playgroud)
代码在python 2中运行正常,但令我惊讶的是,如果我删除import语句,那么我得到一个错误TypeError: Upper object is not an iterator.我经常从我的自定义类派生,object但我从未从内置导入它.为什么简单导入会object改变代码的行为?
Mar*_*ers 24
您(间接)从future.builtins模块导入; 它提供了一个自定义 object基类,可以添加前向特殊名称.
在Python 2中,迭代器必须有一个next()方法(以及__iter__); 此方法__next__在Python 3中重命名为.通过不使用该future.builtins.object版本,您只是缺少Python 2中提供的next- > __next__别名.
查看源代码future.types.newobject.py:
Run Code Online (Sandbox Code Playgroud)def next(self): if hasattr(self, '__next__'): return type(self).__next__(self) raise TypeError('newobject is not an iterator')
请注意,builtins如果您运行的是Python 3,它将返回标准的内置对象,该模块仅为Python 2返回类似这些的填充程序.
您可以自己添加相同的别名:
class Upper(object):
def __init__(self, iterable):
self._iter = iter(iterable)
def __iter__(self):
return self
def __next__(self): # Py3-style iterator interface
return next(self._iter).upper() # builtin next() function calls
next = __next__ # Py2 alias
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6511 次 |
| 最近记录: |