Comment avez-vous gérer harmonieusement échec des fonctionnalités futures importations? Si un utilisateur est en cours d'exécution à l'aide de Python 2.5 et la première instruction dans mon module est:
from __future__ import print_function
La compilation de ce module pour Python 2.5 échouera avec un:
File "__init__.py", line 1
from __future__ import print_function
SyntaxError: future feature print_function is not defined
Je tiens à informer l'utilisateur qu'ils ont besoin de relancer le programme avec Python >= 2.6 et peut-être donner quelques instructions sur la façon de le faire. Cependant, pour citer PEP 236:
Les seules lignes qui peuvent apparaître avant un future_statement sont:
- Le module de docstring (le cas échéant).
- Commentaires.
- Des lignes vides.
- D'autres future_statements.
Donc je ne peux pas faire quelque chose comme:
import __future__
if hasattr(__future__, 'print_function'):
from __future__ import print_function
else:
raise ImportError('Python >= 2.6 is required')
Parce qu'il donne:
File "__init__.py", line 4
from __future__ import print_function
SyntaxError: from __future__ imports must occur at the beginning of the file
Cet extrait de la PEP semble donner de l'espoir de le faire en ligne:
Q: je veux enrouler future_statements dans les blocs try/except, donc je peux l'utiliser code différent selon l' la version de Python, je suis en cours d'exécution. Pourquoi ne puis-je pas?
A: Désolé! try/except est un moteur d'exécution fonctionnalité; future_statements sont surtout au moment de la compilation de gadgets, et votre try/except arrive longtemps après la compilateur est fait. C'est, par la fois que vous faites try/except, la sémantique en effet, pour le module sont déjà un fait accompli. Depuis le try/except ne pas accomplir ce qu'il semble comme il doit accomplir, c'est tout simplement pas autorisé. Nous voulons aussi garder ces déclarations spéciales très facile à les trouver et de les reconnaître.
Notez que vous pouvez importer __future__ directement, et d'utiliser l'information dans il, avec sys.version_info, à la figure où l'édition que vous êtes l'exécution en vertu de l'est à l'égard d'un compte tenu de la fonction d'état.
Des idées?