Um zu Python 3 überzugehen, versuche ich, Python 2 und Python 3 kompatible Codes zu schreiben. Der folgende Code stammt von python-future.org
und veranschaulicht eine Möglichkeit, einen Iterator zu erstellen, der mit beiden Versionen von Python kompatibel ist.In Python, warum "Objekt" aus dem eingebauten Modul importieren?
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')
Der Code läuft gut in Python 2, aber zu meiner Überraschung, wenn ich die Import-Anweisung entferne dann bekomme ich einen Fehler TypeError: Upper object is not an iterator
. Ich leite oft meine benutzerdefinierten Klassen von object
ab, aber ich habe es nie von eingebauten importiert. Warum ändert einfach das Importieren des Codes object
das Verhalten?
In Python 2 müssen 'Builtins 'installiert werden. Es ist für das Schreiben von Code kompatibel auf Python 2 und 3 konzipiert. –
Wenn * I * diesen Code in Python 2 ausführen, bekomme ich 'ImportError: Kein Modul namens builtins'. Es gibt * ein Modul mit dem Namen '__builtin__', und ich kann 'von__builtin__ import object', aber es macht keinen Unterschied, ich bekomme den' TypeError: Oberes Objekt ist kein Iterator'. Das macht Sinn, denn in Python 2 implementieren Sie 'next', nicht' __next__', um ein Iterator zu sein. Ich denke, das Codebeispiel, das Sie gerade lesen, ist einfach falsch. Könnten Sie bitte einen direkten Link dazu schreiben? Bitte teilen Sie uns auch genau mit, welche Versionen von Python 2 und 3 Sie testen. – zwol
Also gibt es einen Unterschied zwischen dem '' Objekt'', das im Standard-Namespace verfügbar ist und dem, der von '' builtins'' importiert wird? – deepak