2012-09-19 15 views
7

En python 2.x, al dividir dos enteros se devuelve un número entero. Sin embargo, si se utiliza¿Cómo puedo eliminar/eliminar símbolos de __future__ después de importarlos?

from ___future___ import division 

se puede obtener un valor de coma flotante:

>>> 3/2 
1 
>>> from __future__ import division 
>>> 3/2 
1.5 
>>> 
>>> 
>>> 3//2 
1 
>>> 4/3 
1.3333333333333333 
>>> 

Después de la import, usted tiene que utilizar // en lugar de / hacer la división entera. ¿Cómo puedo revertir el import para que / vuelva a hacer la división de enteros?

+2

¿Por qué querrías hacer eso? –

Respuesta

12

__future__ Las importaciones son especiales y no se pueden deshacer. Puede leer sobre su comportamiento here.

Éstos son unas pocas porciones relevantes:

Una declaración futuro se reconoce y trata especialmente en tiempo de compilación: Cambios en la semántica de las construcciones de núcleo a menudo se implementan mediante la generación de código diferente. Incluso puede ser que una nueva característica introduzca una nueva sintaxis incompatible (como una nueva palabra reservada), en cuyo caso el compilador puede necesitar analizar el módulo de manera diferente. Tales decisiones no pueden descartarse hasta el tiempo de ejecución.
...
Una instrucción futura escrita en un intérprete interactivo se aplicará para el resto de la sesión del intérprete.

Dado que las declaraciones __future__ se manejan en tiempo de compilación en lugar de en tiempo de ejecución, no hay un método de tiempo de ejecución para revertir el comportamiento modificado.

Con módulos normales, puede eliminar o eliminar la importación del módulo eliminando lo importado del espacio de nombres y eliminando la entrada para esa importación en sys.modules (esta segunda parte puede no ser necesaria según el caso de uso, todo lo que hace es forzar la recarga del módulo si se importa de nuevo).

+0

+1 a ambas, esta respuesta (que explica el problema) y la de Brendan Long (que explica cómo el OP puede realmente hacer lo que quiere hacer). – abarnert

+1

Tenga en cuenta también que los módulos de extensión (_i.e._ los escritos en lenguajes compilados como C) no se pueden descargar, porque están integrados en el espacio de direcciones del intérprete en la importación. – holdenweb

4

import declaraciones son locales de archivo que ha importado, así que por ejemplo, si usted tiene este archivo como example.py:

from __future__ import division 
print(1/2) 

A continuación, cargarlo en otro archivo:

import example # prints 0.5 because `division` is imported in example.py 
print(1/2) # prints 0 because `division` is not imported in this file 
Así

si quiere una importación que solo se usa en algunos de sus códigos, coloque ese código en un archivo separado.

En el caso que diste, no estoy seguro de que sea útil. ¿Por qué no usar // cuando necesita una división entera?

+0

Una respuesta por la cual alguien querría "no importar" la división futura es por pruebas unitarias. Estoy sobrecargando a los operadores de la división y quiero verificar el comportamiento de una sola barra en Python 2. Podría llamar directamente a '__div __()'. Su respuesta puede ser una mejor solución: pruebas con una barra en un archivo fuente diferente. –

Cuestiones relacionadas