Frage

Ich bin sicher, dass dies ein Thema, das den Köpfen auf den meisten Python-Entwickler ist man bedenkt, dass Python 3 wird bald herauskommen. Einige Fragen, um uns in der richtigen Richtung:

  1. Wollen Sie eine Python 2 und Python 3-Version haben gleichzeitig beibehalten werden oder werden Sie einfach eine Python 3-Version haben, sobald es fertig ist?

    • Haben Sie bereits begonnen oder planen, bald zu beginnen? Oder planen Sie warten, bis die endgültige Version kommt in Schwung zu bekommen?
War es hilfreich?

Lösung

Hier ist der allgemeine Plan für Twisted. Ich war ursprünglich das geht zum Blog, aber dann dachte ich: warum darüber bloggen, wenn ich Punkte für sie bekommen konnte

  1. Warten Sie, bis jemand sich interessiert.

    Im Moment niemand hat Python 3. Wir werden nicht bis mindestens ein tatsächlicher Benutzer gekommen ist, beschreibt eine Reihe von Anstrengungen zu verbringen und sagte: „Ich brauche Python 3.0-Unterstützung“, und hat einen guten Grund dafür, abgesehen von die Tatsache, dass 3,0 sieht glänzend.

  2. Warten Sie, bis unsere Abhängigkeiten migriert haben.

    Ein großes System wie Verdrehte hat eine Reihe von Abhängigkeiten. Für den Anfang unseres gehören:

    Einige dieser Projekte ihre eigene Reihe von Abhängigkeiten haben, so dass wir für diejenigen, auch warten müssen werden.

  3. Warten Sie, bis jemand kümmert sich genug helfen .

    Es gibt charitably, 5 Personen, die auf Verdrehte arbeiten - und ich sage „nachsichtig“, denn das ist mir zu zählen, und ich habe nicht in Monaten begangen. Wir haben über 1000 offene Tickets gerade jetzt, und es wäre schön, um tatsächlich einige von denen zu beheben - Fehler beheben, Funktionen hinzufügen, und macht im allgemeinen Verdrehte ein besseres Produkt in seinem eigenen Recht -., bevor die Zeit verbringen, auf dem erhalten ich über in eine im wesentlichen neuen Version der Sprache portierte

    Dazu gehören möglicherweise Sponsoren fürsorglich genug, um zu zahlen für uns, es zu tun, aber ich hoffe, dass es wird ein Zustrom von Freiwilligen sein, die etwa 3,0 Unterstützung kümmern und sich darauf, die Gemeinschaft helfen wollen bewegen.

  4. Folgen Sie Guido Rat ab.

    Dieses Mittel wir unsere API nicht inkompatibel ändern , und wir werden die Übergangs-Entwicklung folgen Richtlinien dass Guido im vergangenen Jahr geschrieben. Das beginnt mit Unit-Tests mit und läuft das 2to3-Konvertierungs-Werkzeug über die Twisted-Code-Basis.

  5. Melden Sie Fehler gegen und Datei-Patches für das 2to3-Tool .

    Wenn wir zu dem Punkt, wo wir es tatsächlich verwenden, Ich gehe davon aus, dass es mit dem Betrieb 2to3 in Zukunft eine Menge Probleme. Laufen sie über Twisted nimmt jetzt eine extrem lange Zeit und (zuletzt geprüft ich, was schon eine ganze Weile her war) können einige der Dateien im Twisted-Repository nicht analysieren, so dass die Ausgabe wird nicht importieren. Ich denke, es wird eine angemessene Menge von Erfolgsgeschichten von kleinen Projekten und vielen Hammer auf dem Werkzeug sein muß, bevor es für uns tatsächlich funktioniert.

    Allerdings hat die Python-Entwicklungsteam sehr hilfreich, um unsere Fehlerberichte zu reagieren und frühzeitig Antworten auf diese Probleme ermutigend gewesen, so erwarte ich, dass alle diese Fragen wird in der Zeit festgelegt werden.

  6. Pflegen 2.x-Kompatibilität für several Jahre.

    Im Moment unterstützt Twisted-Python 2,3 bis 2,5. Derzeit arbeiten wir an 2.6-Unterstützung (die wir natürlich vor 3.0 fertig haben!). Unser Plan ist es, wir unterstützte Versionen von Python zu revidieren, basierend auf den langfristigen unterstützten Versionen von Ubuntu - Release 8.04, die 2,5 Python enthält, wird bis zum Jahr 2013 laut Guido Rat unterstützt werden wir die Unterstützung für 2.5, um fallen müssen 3.0 zu unterstützen, aber ich hoffe, wir einen Weg, um das finden (wir ziemlich kreativ mit Version-Kompatibilität Hacks).

    So planen wir Python 2.5 bis mindestens 2013. In zwei Jahren zu unterstützen, wird Ubuntu Release eine weitere langfristige unterstützte Version von Ubuntu: wenn sie noch vorhanden sind, und bleiben im Zeitplan, das 10,04 sein. Persönlich, dass ich vermute, dass dies mit Python 2.x ausgeliefert wird, vielleicht 2,8 Python, wie /usr/bin/python, weil es eine riesige Menge von Python-Software mit dem Vertrieb verpackt ist, und es wird lange dauern, sie alle zu aktualisieren. So, fünf Jahre von und , im Jahr 2015, können wir beginnen, bei dropping 2.x Unterstützung.

    Während dieser Zeit werden wir auch weiterhin Guido Tipps zum Thema Migration folgen. 2to3 über unsere 2.x-Codebasis, und Modifizieren der 2.x-Code-Basis seine Tests zu halten in beiden Versionen vorbei

    Das Ergebnis davon ist, dass Python 3.x wird nicht eine source Sprache für Twisted bis weit nach meinem 35. Geburtstag - es wird eine Ziellaufzeit (und eine Reihe von Richtlinien und Einschränkungen) sein für meinen python 2.x-Code. Ich erwarte, dass Programme in Python 2.x für die nächsten zehn Jahre zu schreiben oder so.

Also, das ist der Plan. Ich hoffe, dass es lachhaft konservativ in einem Jahr der Suche endet oder so; dass der 3.x Übergang ist kinderleicht, und jeder schnell aktualisiert. Andere Dinge passieren könnte, auch: die 2.x und 3.x Zweige konvergieren könnte, könnte jemand ein 3to2 Schreiben am Ende oder eine andere Laufzeit (PyPy den Sinn kommt) für den Betrieb ermöglichen könnten 2.x und 3.x Code in der gleicher Prozess direkt, unser Umwandlungsprozess zu erleichtern.

Für den Augenblick aber sind wir, dass unter der Annahme, seit vielen Jahren, werden wir Menschen mit großen Codebases haben sie beibehalten wird (oder Menschen neuen Code zu schreiben, der verwendet werden sollen andere Bibliotheken die noch nicht migriert wurden), die noch neue Features und Bugfixes in Verdrehte möchten. Ziemlich bald erwarte ich, dass wir auch bleeding-edge-Nutzer haben, die Verdrehte verwenden auf Python wollen 3. Ich mag würde all diese Menschen mit einer positiven Erfahrung für so lange wie möglich erhalten.

Andere Tipps

Das Django-Projekt verwendet die Bibliothek six eine Code-Basis zu erhalten, die gleichzeitig auf Python 2 funktioniert und Python 3 ( Blog-Eintrag ).

six tut dies durch eine Kompatibilitätsschicht bereitstellt, die Importe und Funktionen zu ihren jeweiligen Standorten (wie auch die Vereinheitlichung andere inkompatible Änderungen) auf intelligente Weise umleitet.

Klare Vorteile:

  • Keine Notwendigkeit für getrennte Zweige für Python 2 und Python 3
  • Keine Konvertierungs-Tools, wie 2to3.

Die Grundidee von 2,6 ist einen Migrationspfad zu 3,0 bereitzustellen. So können Sie from __future__ import X verwenden langsam ein Merkmal zu einem Zeitpunkt der Migration, bis Sie alle von ihnen bekommen genagelt und 3,0 bewegen kann. Viele der 3.0-Funktionen werden in 2.6 fließen als gut, so können Sie die Sprache Lücke kleiner machen allmählich anstatt alles auf einmal migrieren zu müssen.

Bei der Arbeit planen wir 2,5-2,6 zuerst zu aktualisieren. Dann beginnen wir 3.0-Funktionen langsam ein Modul zu einer Zeit ermöglicht. An einem gewissen Punkt eine ganze subpart des Systems wird wahrscheinlich für 3.x bereit sein.

Das einzige Problem sind Bibliotheken. Wenn eine Bibliothek nie migriert wird, werden wir mit der alten Bibliothek stecken. Aber ich bin mir ziemlich sicher, dass wir für diesen Teil eine feine Alternative zu gegebener Zeit erhalten werden.

Beim Reden als Bibliothek Autor:

ich für die endgültige Version warte freigegeben werden. Mein Glaube, wie die meisten der Python-Community, ist, dass 2.x weiterhin die dominierende Version für einen Zeitraum von Wochen oder Monaten. Das ist viel Zeit, eine schöne, poliert 3.x Version Version.

Ich werde separate 2.x und 3.x Filialen wird beibehalten. 2.x wird abwärtskompatibel zu 2.4, also kann ich nicht viel von der Phantasie Syntax oder neuer Funktionen in 2.6 / 3.0 verwenden. Im Gegensatz dazu wird der 3.x-Zweig jedes einzelne dieser Funktionen nutzen, die für den Benutzer in einem schöneren Erlebnis führt. Die Testsuite modifiziert werden, so dass 2to3 auf, es wird funktionieren, und ich werde die gleichen Tests für beide Zweige halten.

Unterstützung sowohl

Ich wollte einen Versuch machen, die BeautifulSoup Bibliothek bei der Umwandlung für ein Projekt 3x arbeite ich an, aber ich kann sehen, wie es ein Schmerz sein würde zwei verschiedene Zweige des Codes zu erhalten.

Das aktuelle Modell zu handhaben hierfür sind:

  1. eine Änderung an dem 2x Zweig
  2. laufen 2to3
  3. beten, dass es die Umwandlung richtig das erste Mal tut
  4. führen Sie den Code
  5. laufen Unit-Tests, um sicherzustellen, dass alles funktioniert
  6. Kopieren Sie die Ausgabe an den 3x Zweig

Dieses Modell funktioniert, aber IMHO saugt es. Für jede Änderung / freigeben Sie durch diese Schritte gehen :: Seufzer ::. Außerdem schreckt es Entwickler, den ich von dem 3x Zweig mit neuen Funktionen, die nur in py3k unterstützt werden können, weil Sie immer noch im Wesentlichen der gesamten Code Targeting auf 2x.

Die Lösung ... verwenden, um einen Prä-Prozessor

Da ich nicht einen anständigen c-Stil Präprozessor mit #define und #ifdef Richtlinien für Python finden konnte, schrieb ich ein.

Es heißt pypreprocessor und kann im PyPI finden

Im Grunde, was Sie tun, ist:

  1. Import pypreprocessor
  2. erkennen, welche Version von Python das Skript in läuft
  3. set a 'definiert' im Preprocessor für die Version (ex 'python2' oder 'python3')
  4. bestreuen '#ifdef python2' und '#ifdef python3' Richtlinien, wo der Code ist versionsspezifische
  5. führen Sie den Code

Das ist es. Jetzt wird es in beiden 2x und 3x arbeiten. Wenn Sie sich über zusätzliche Leistung Hit der Führung einen Präprozessor besorgt sind gibt es auch einen Modus, der alle Metadaten und Ausgang die nachbearbeitete Quelle in eine Datei Streifen aus wird.

Best of all ... Sie nur einmal die 2to3 Umwandlung zu tun hat.

Hier ist das ein funktionierendes Beispiel:

#!/usr/bin/env python
# py2and3.py

import sys
from pypreprocessor import pypreprocessor

#exclude
if sys.version[:3].split('.')[0] == '2':
    pypreprocessor.defines.append('python2')
if sys.version[:3].split('.')[0] == '3':
    pypreprocessor.defines.append('python3')

pypreprocessor.parse()
#endexclude
#ifdef python2
print('You are using Python 2x')
#ifdef python3
print('You are using python 3x')
#else
print('Python version not supported')
#endif

Dies sind die Ergebnisse in der Klemme:

 python py2and3.py
 >>>You are using Python 2x 
 python3 py2and3.py
 >>>You are using python 3x

Wenn Sie in eine Datei ausgegeben werden sollen und ohne zusätzliche Meta-Daten, fügen Sie diese beiden Zeilen irgendwo vor der pypreprocessor.parse () Aussage sauber versionsspezifische Quelldatei:

pypreprocessor.output = outputFileName.py
pypreprocessor.removeMeta = True

Dann:

python py2and3.py

Wird eine Datei erstellen outputFileName.py genannt, die Python 2x spezifisch ohne zusätzliche Metadaten ist.

python3 py2and3.py

Wird eine Datei erstellen outputFileName.py genannt, die Python 3x spezifisch ohne zusätzliche Metadaten ist.

siehe

Für die Dokumentation und weitere Beispiele Besuche pypreprocessor auf Google .

Ich hoffe, das hilft. Ich liebe das Schreiben von Code in Python und ich hoffe, so bald wie möglich Unterstützung Fortschritte in den 3x Bereich zu sehen. Ich hasse die Sprache keinen Fortschritt zu sehen. Vor allem, da die 3x-Version viele der vorgestellten WTFs löst und macht die Syntax schauen ein wenig freundlicher zu den Benutzern aus anderen Sprachen zu migrieren.

Die Dokumentation zu diesem Zeitpunkt abgeschlossen ist, aber nicht sehr umfangreich. Ich werde versuchen, bald das Wiki nach oben mit etwas umfangreichere Informationen zu erhalten.

Update:

Obwohl ich pypreprocessor speziell um dieses Problem zu lösen, ist es nicht funktioniert, weil die Lexer Syntax tut auf dem gesamten Code überprüft, bevor ein Code ausgeführt wird.

Wenn Python echte C Präprozessordirektive Unterstützung hatte es Entwickler erlauben würde, die nebeneinander in der gleichen Datei, aber aufgrund des schlechten Ruf des C-Präprozessor (Missbrauch von Makro Ersatz sowohl Python2X und python3k Code zu schreiben, die Sprache zu wechseln keywords) ich wird nicht legitim C Preprozessor Unterstützung sehen hinzugefügt jederzeit bald Python.

Das Zope Toolkit hat Python 3 Unterstützung in einem langsamen Fortschritt. Langsam vor allem, weil viele dieser Bibliotheken sehr komplex sind.

Für die meisten Bibliotheken verwende ich 2to3. Einige Bibliotheken machen tun, ohne es, weil sie einfach sind, oder haben die meisten den Code in einer C-Erweiterung. zc.buildout, die ein verwandtes Paket ist, den gleichen Code ohne 2to3 für Python 2 und 3 Unterstützung ausgeführt werden.

Wir portieren die ZTK auf Python 3, weil viele andere Bibliotheken und Frameworks davon abhängen, wie verdreht und die Pyramide Rahmen.

Einige meiner komplexeren 2.x Code wird auf 2.5 oder 2.6 bleiben. Ich bin auf 3.0 für alle neuen Entwicklung zu bewegen, wenn einige der 3rd-Party-Bibliotheken, die ich häufig verwenden, sind für 3 aktualisiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top