9
votes

Soutenir différentes versions de Python

Ce sujet m'a dérangé depuis un certain temps.

pour Mon projet Python Je voulais pouvoir prendre en charge les versions Python 2.4 à 3.1. Je pensais un peu comment faire cela et, éventuellement décidé d'avoir quatre fourches distinctes du code source pour quatre versions différentes de Python: 2.4, 2.5, 2.6 et 3.1.

Je suis venu de voir cela comme une mauvaise décision, principalement à cause des ennuis de la distribution de Python, que je dois maintenant faire quatre fois au lieu d'un.

La question est, que faire quoi faire?

Mon projet est dans le domaine informatique scientifique. J'ai eu l'impression qu'il y a encore beaucoup de gens qui dépendent de Python 2.4.

Quelqu'un a suggéré d'écrire tout mon projet pour 2.4, mais c'est inacceptable pour moi. Cela signifiera que je ne pouvais pas utiliser les gestionnaires de contexte, et c'est quelque chose que je n'abandonnerai pas.

Comment les projets Python ordinaires soutiennent-ils 2.4? Évitent-ils d'utiliser des gestionnaires contextuels?

Aussi, y a-t-il un choix mais ayant une fourchette séparée pour Python 3.1? Je sais qu'il y a toutes sortes de hacks pour faire fonctionner le même code sur 2.x et 3.x, mais l'une des raisons pour lesquelles j'aime Python est parce que le code est magnifique et je ne tolérerai pas la rendant laidée avec des hacks de compatibilité.

S'il vous plaît, donnez-moi votre avis.


0 commentaires

6 Réponses :


1
votes

Oui, vous devez écrire pour la syntaxe Python 2.4 pour prendre en charge l'ensemble de 2,4 - 2,7 dans la même basebase.

Certains changements de Python 2.6 et 2.7 visent à le rendre un peu plus facile d'écrire un code compatible avec 3.x, mais vous devez supprimer la prise en charge de 2,5 et ci-dessous pour le faire.


1 commentaires

Je vois. Je suis prêt à explorer des options de ne pas le faire dans la même basebase. En fait, c'est ce que je fais maintenant, à l'extrême, avoir des fourches séparées pour différentes versions. Peut-être que je pourrais le faire plus intelligemment cependant.



0
votes

Si les différences entre les versions ne sont pas extrêmes, vous pouvez les isoler dans un package ou un module séparé dans lequel vous écrivez un code spécifique à la version pour agir en tant que couche d'adaptation.

de manière triviale, cela peut être fait Sans le module séparé dans des cas simples, tels que lorsqu'une nouvelle version de Python rend standard un emballage utilisé pour être externe, tel que (par exemple) SimpleJson. Nous avons quelque chose de similaire à celui-ci dans certains CODE: P>

try:
    import simplejson as json
except ImportError:
    import json


0 commentaires

0
votes

Tout d'abord, vous devez garder à l'esprit que Python 2.x partage la plupart des mêmes syntaxes compatibles, nouvelles fonctionnalités et ajouts de côté. Il y a d'autres choses à considérer que ce n'est pas nécessairement des erreurs, telles que les messages de dépréciation de la dépréciation que, tout en ne préjudice, sont laids et peuvent causer de la confusion.

Python 3.x est incompatible-incompatible avec la conception et a l'intention de laisser tout l'ancien cruft derrière. Python 2.6 a introduit de nombreux changements qui sont également dans Python 3.x pour faciliter la transition. Pour tous les voir, je recommanderais de lire sur le Quoi de neuf dans Python 2.6 Document . Pour cette raison, il est très possible d'écrire du code pour Python 2.6 qui fonctionnera également à Python 3.1, mais ce n'est pas sans réserve.

Même toujours, il existe de nombreuses modifications de syntaxes mineures entre des versions 2.x qui vous exigeront de vous envelopperez beaucoup de votre code dans Essayez / sauf des blocs, donc si C'est ce que vous êtes prêt à faire alors que la branche 2.x et 3.x est totalement possible. Je pense que vous constaterez que vous ferez beaucoup d'attributs et de tests de type sur vos objets pour faire ce que vous voulez faire.

Je vous recommanderais de consulter le code de grands projets qui prennent en charge diverses versions Python. matrice tordue est la première qui me vient à l'esprit. Leur code est un excellent exemple de la manière dont le code Python devrait être écrit.

À la fin, ce que vous différez à faire ne sera pas facile, alors préparez-vous à beaucoup de travail!


3 commentaires

Où avez-vous vu les différentes branches pour 2.4-2.6? J'ai vu différents téléchargements binaires pour Windows, mais la source ressemble à un dossier. Ai-je manqué quelque chose?


SET et FROZENSET a été ajouté dans Python 2.4 . python.org/doc/2.4.4/whatsnew/whatsnew24.html < / a>


@ Cool-RR - Non, c'était moi qui manquait quelque chose. J'ai supprimé les mauvaises informations. @ KAIZER.SE - Merci, je confondre la dépréciation Modules avec l'addition des types intégrés.



1
votes

Il semble que vous soyez des réponses différentes à votre problème.

Premièrement, si vous souhaitez offrir toutes les fonctions pour toutes les versions de Python, vous êtes probablement bloqué par l'utilisation du sous-ensemble de fonctionnalités possibles possibles. Par conséquent, écrivez votre code Pour Python 2.4. Ou vous pouvez rétrocler des fonctionnalités de nouveaux interprètes s'il s'agit de python pur (ce n'est pas le cas des gestionnaires de contexte ni des coroutine ni).

ou vous pouvez diviser la version de la version en fonctionnalités - si vous pensez qu'il y a une fonctionnalité (facultatif) qui aurait un grand bénéfice de, disons, les gestionnaires de contexte, vous pouvez le rendre disponible dans un module séparé et dire que 24 utilisateurs Don 't avoir cette fonctionnalité.

Pour supporter Python 3, jetez un coup d'œil à l'aide de l'aide 2To3, si vous écrivez votre code correctement, vous n'avez pas besoin de conserver deux codes distincts.


0 commentaires

0
votes

Vous pouvez essayer Virtualenv et distribuer votre application à l'aide d'une seule version Python. Cela peut ou non être pratique dans votre cas cependant.


0 commentaires

0
votes

Nous avons un problème connexe, un grand système qui prend en charge Jython et CPPHON à 2,4. Fondamentalement, vous devez isoler le code qui doit être écrit différemment dans un petit ensemble de modules, espérons-le, et que les choses sont importées de manière conditionnelle. xxx pré>

dans votre exemple, vous utiliseriez des tests contre sys.version_info, probablement. Vous pouvez définir des choses simples dans un module utilitaire que vous utiliseriez comme: de l'utilisation UTIL IMPORT * P>

### 2.5 (with appropriate future import) and later
with open('foo','rb')as myfile:
   # do something with myfile

### 2.4 and earlier   
myfile = None
try:
    myfile = open('foo','rb')
    # do something with myfile
finally:
    if myfile: myfile.close()


0 commentaires