2012-03-27 12 views
9

Sto iniziando a imparare Python, ma sono costretto a utilizzare un interprete v2.6.2.Quali caratteristiche di __future__ dovrei importare in Python v2.6.2?

voglio arrivare il più vicino possibile a Python 3, per esempio, utilizzando la nuova funzione di print, "vera" divisione, ecc

from __future__ import division 
from __future__ import print_function 
print(1/2, file=sys.stderr) # 0.5 

Quali altre caratteristiche dovrei importare __future__?

Credo che avrei potuto fare un generale import __future__ ma poi vorrei avere un comportamento diverso quando l'aggiornamento a una versione superiore (v2.7 potrebbe avere più funzionalità in __future__), e il mio script potrebbe smettere di funzionare, allora.

+0

Sei sicuro che sia saggio? Se sei costretto a usare Python 2.x e inizi a scrivere codice nello stile di Python 3.x, chi non ti obbligherà a usare 2.x si lamenterà? –

+1

@DavidHeffernan: No, posso scrivere i miei script come voglio. È solo che sono su un vecchio computer che ha installato Python v2.6.2 e installare Python v3 in aggiunta non sembra essere un'opzione. – Frank

+1

L'installazione di Python 3 è totalmente un'opzione – Amber

risposta

7

Beh, anche se non ci fosse documentation, __future__ è anche un modulo regolare che ha alcune informazioni su se stesso:

>>> import __future__ 
>>> __future__.all_feature_names 
['nested_scopes', 'generators', 'division', 'absolute_import', 'with_statement', 'print_function', 'unicode_literals'] 
>>> __future__.unicode_literals 
_Feature((2, 6, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 131072) 

Python 2.6 ha la maggior parte delle caratteristiche già abilitati, in modo da scegliere da division, print_function, absolute_import e unicode_literals.

E no, import __future__ non funzionerà come credi. È magico solo quando si utilizza il modulo from __future__ import something come prima istruzione nel file. Vedi the docs per ulteriori informazioni.

Ovviamente, non importa quanto importi da __future__, si otterrà un comportamento diverso in 3.x.

+0

Vorrei saltare 'unicode_literals', vedere http://stackoverflow.com/questions/809796/any-gotchas-using-unicode-literals-in-python-2-6 – agf

+1

@agf quelli sono modi in cui il codice potrebbe interrompersi se aggiungete ciecamente 'unicode_literals', ma semplicemente indicano cose che dovrebbero essere corrette comunque. L'approccio di Python 3 all'unicode è semplicemente più sensato. –

+0

@KarlKnechtel O Nick Coglan o Raymond Hettinger hanno consigliato di non usarlo, dicendo che includerlo in "__futura__" è stato un errore. Non ricordo se fosse qui su SO o su un post del blog. Ho appena usato quel link perché non riesco a trovare quello che sto pensando in questo momento. – agf

7

Quali altre funzionalità devo importare da __future__?

per ottenere il comportamento più up-to-date, si dovrebbe ovviamente importazione ogni __future__ caratteristica che è offerto, ad eccezione di quelle che si ottiene in ogni caso. (Il modo in cui il sistema è impostato, le vecchie funzioni non vengono eliminati, anche dopo che sono always-on.)

Nota che import __future__ sarà non ti offre tutto ciò, e neppure from __future__ import *. La sintassi from ... import ... è con custodia speciale per __future__ (che è come funziona), ma __future__ è ancora un modulo reale che è possibile importare con import __future__. Tuttavia, facendo ciò ti verranno comunicati i nomi effettivi delle funzioni, nonché le informazioni su quando erano (o dovrebbero essere) rese predefinite e quando diventavano disponibili.

>>> [ 
...  name for name in __future__.all_feature_names if 
...  getattr(__future__, name).optional <= 
...  sys.version_info < 
...  getattr(__future__, name).mandatory 
... ] 

['division', 'print_function', 'unicode_literals'] 

è quello che ottengo su 2.7.2.

Problemi correlati