__future__
apparaît fréquemment dans les modules Python. Je ne comprends pas à quoi __future__
ça sert et comment / quand l'utiliser même après avoir lu le __future__
doc de Python .
Quelqu'un peut-il expliquer avec des exemples?
Quelques réponses concernant l'utilisation de base de __future__
J'ai reçu semblaient correctes.
Cependant, je dois comprendre une dernière chose concernant le __future__
fonctionnement:
Le concept le plus déroutant pour moi est de savoir comment une version actuelle de python comprend des fonctionnalités pour les futures versions, et comment un programme utilisant une fonctionnalité d'une future version peut être compilé avec succès dans la version actuelle de Python.
Je suppose que la version actuelle est emballée avec des fonctionnalités potentielles pour l'avenir. Cependant, les fonctionnalités ne sont disponibles qu'en utilisant __future__
car elles ne sont pas la norme actuelle. Faites-moi savoir si j'ai raison.
la source
Réponses:
Avec
__future__
l'inclusion du module, vous pouvez lentement vous habituer à des changements incompatibles ou à de tels changements introduisant de nouveaux mots clés.Par exemple, pour utiliser les gestionnaires de contexte, vous deviez le faire
from __future__ import with_statement
en 2.5, car lewith
mot - clé était nouveau et ne devrait plus être utilisé comme nom de variable. Pour l'utiliserwith
comme mot-clé Python dans Python 2.5 ou une version antérieure, vous devrez utiliser l'importation par le haut.Un autre exemple est
Sans le
__future__
truc, les deuxprint
déclarations s'imprimeraient1
.La différence interne est que sans cette importation,
/
est mappé à la__div__()
méthode, tandis qu'avec elle,__truediv__()
est utilisé. (Dans tous les cas,//
appelle__floordiv__()
.)Apropos
print
:print
devient une fonction dans 3.x, perdant sa propriété spéciale comme mot-clé. C'est donc l'inverse.la source
from __future__ import braces
: pprint
c'est certainement une fonction, mais il peut y avoir d'autres fonctionnalités qui pourraient être utilisées__future__
. (Modifier: voir docs.python.org/3/library/__future__.html où il est encore utilisé.)Quand tu fais
Vous n'utilisez pas réellement une
import
déclaration, mais une future déclaration . Vous lisez les mauvais documents, car vous n'importez pas réellement ce module.Les futures instructions sont spéciales - elles changent la façon dont votre module Python est analysé, c'est pourquoi elles doivent être en haut du fichier. Ils donnent un sens nouveau - ou différent - aux mots ou symboles de votre fichier. De la documentation:
Si vous voulez réellement importer le
__future__
module, faites simplementpuis accédez-y comme d'habitude.
la source
from __future__ import print_function
les deux modifient le comportement duprint
mot - clé et ont un effet d'exécution équivalent àprint_function = __import__("__future__").print_function
__future__
est un pseudo-module que les programmeurs peuvent utiliser pour activer de nouvelles fonctionnalités de langage qui ne sont pas compatibles avec l'interpréteur actuel . Par exemple, l'expression est11/4
actuellement évaluée à2
. Si le module dans lequel il est exécuté avait permis une véritable division en exécutant:from __future__ import division
l'expression
11/4
serait évaluée à2.75
. En important le__future__
module et en évaluant ses variables, vous pouvez voir quand une nouvelle fonctionnalité a été ajoutée pour la première fois à la langue et quand elle deviendra la valeur par défaut:la source
import __future__ xyz
est-ce un non-op?Il peut être utilisé pour utiliser des fonctionnalités qui apparaîtront dans les versions plus récentes tout en ayant une ancienne version de Python.
Par exemple
vous permettra d'utiliser
print
en fonction:la source
Il existe déjà d'excellentes réponses, mais aucune d'entre elles n'aborde une liste complète de
__future__
déclaration prend actuellement en charge.En termes simples, l'
__future__
instruction force les interprètes Python à utiliser les nouvelles fonctionnalités du langage.Les fonctionnalités qu'il prend actuellement en charge sont les suivantes:
nested_scopes
Avant Python 2.1, le code suivant déclencherait une erreur NameError :
La
from __future__ import nested_scopes
directive permettra d'activer cette fonctionnalité.generators
Introduction de fonctions de générateur telles que celle ci-dessous pour enregistrer l'état entre les appels de fonction successifs:
division
La division classique est utilisée dans les versions Python 2.x. Cela signifie que certaines déclarations de division renvoient une approximation raisonnable de la division ("vraie division") et d'autres renvoient le plancher ("division de l'étage"). À partir de Python 3.0, la véritable division est spécifiée par
x/y
, tandis que la division au sol est spécifiée parx//y
.La
from __future__ import division
directive force l'utilisation de la division de style Python 3.0.absolute_import
Permet aux parenthèses de joindre plusieurs
import
instructions. Par exemple:Au lieu de:
Ou:
with_statement
Ajoute l'instruction en
with
tant que mot clé en Python pour éliminer le besoin d'try/finally
instructions. Les utilisations courantes de ceci sont lors des E / S de fichiers telles que:print_function
:Force l'utilisation de l'
print()
appel de fonction de style parenthèse Python 3 au lieu de l'print MESSAGE
instruction de style.unicode_literals
Présente la syntaxe littérale de l'
bytes
objet. Cela signifie que des déclarations telles quebytes('Hello world', 'ascii')
peuvent être simplement exprimées parb'Hello world'
.generator_stop
Remplace l'utilisation de l'
StopIteration
exception utilisée dans les fonctions du générateur par l'RuntimeError
exception.Une autre utilisation non mentionnée ci-dessus est que l'
__future__
instruction nécessite également l'utilisation d'interpréteurs Python 2.1+, car l'utilisation d'une ancienne version générera une exception d'exécution.Références
la source
Ou est-ce comme dire "Puisque c'est python v2.7, utilisez cette fonction 'print' différente qui a également été ajoutée à python v2.7, après avoir été ajoutée en python 3. Donc, mon 'print' ne sera plus des instructions (par exemple, print "message") mais fonctionne (par exemple, print ("message", options). De cette façon, lorsque mon code est exécuté en python 3, 'print' ne se cassera pas. "
Dans
print_function est le module contenant la nouvelle implémentation de 'print' selon la façon dont il se comporte en python v3.
Cela a plus d'explications: http://python3porting.com/noconv.html
la source
L'une des utilisations que j'ai trouvées très utiles est le module
print_function
from__future__
.Dans Python 2.7, je voulais que les caractères de différentes instructions d'impression soient imprimés sur la même ligne sans espaces.
Cela peut être fait à l'aide d'une virgule (",") à la fin, mais il ajoute également un espace supplémentaire. L'instruction ci-dessus lorsqu'elle est utilisée comme:
Cela affichera la valeur de
v_num
chaque itération sur une seule ligne sans espaces.la source
Après Python 3.0, print n'est plus seulement une instruction, c'est une fonction à la place. et est inclus dans PEP 3105.
Je pense également que le package Python 3.0 a toujours ces fonctionnalités spéciales. Voyons son utilité à travers un "programme Pyramid" traditionnel en Python:
Si nous utilisons la fonction d'impression normale, nous ne pourrons pas obtenir la même sortie, car print () est livré avec une nouvelle ligne supplémentaire. Ainsi, chaque fois que la boucle for interne s'exécute, elle s'imprime * sur la ligne suivante.
la source