在python中,为什么要从内置模块导入'object'?

时间:2016-04-09 13:48:23

标签: python python-2.7

为了转换到python 3,我试图理解编写python 2和python 3兼容代码。以下代码来自[2, 4, 7, 8],并说明了构造一个与两个版本的python兼容的迭代器的方法。

python-future.org

代码在python 2中运行正常,但令我惊讶的是,如果我删除了import语句,那么我会收到错误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') 。我经常从TypeError: Upper object is not an iterator派生我的自定义类,但我从未从内置导入它。为什么简单地导入object会改变代码的行为?

1 个答案:

答案 0 :(得分:19)

您(间接)从future.builtins module导入;它提供了一个自定义 object基类,可以添加前向特殊名称。

在Python 2中,迭代器必须有next() method(以及__iter__);此方法已重命名为__next__ in Python 3。如果不使用future.builtins.object版本,则只会错过next - > Python 2中提供了__next__别名。

请参阅source code for future.types.newobject.py

def next(self):
    if hasattr(self, '__next__'):
        return type(self).__next__(self)
    raise TypeError('newobject is not an iterator')

请注意,如果您运行的是Python 3,builtins将返回标准的内置对象,该模块仅为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