2012-06-12 11 views
6

Digamos que tengo un modelo pitón fibo.py definido de la siguiente manera:Python: La importación de módulo

#Fibonacci numbers module 
print "This is a statement" 
def fib(n): 
    a,b = 0,1 
    while b < n: 
     print b 
     a, b = b, a+b 

def fib2(n): 
    a,b = 0,1 
    result= [] 
    while(b < n): 
     result.append(b) 
     a, b = b, a+b 
    return result 

En mi sesión intérprete, hago lo siguiente:

>> import fibo 
This is a statement 
>>> fibo.fib(10) 
1 
1 
2 
3 
5 
8 

>>> fibo.fib2(10) 
[1, 1, 2, 3, 5, 8] 
>>> fibo.__name__ 
'fibo' 
>>> 

Hasta aquí todo bien. .restart el intérprete:

>>> from fibo import fib,fib2 
This is a statement 
>>> fibo.__name__ 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
NameError: name 'fibo' is not defined 
>>> 

esperaba el error ya que solo he importado fib y fib2. Pero no entiendo por qué la declaración se imprimió cuando solo importé fib y fib2.

En segundo lugar si cambio el módulo como:

#Fibonacci numbers module 
print "This is a statement" 
print __name__ 

cuál debería ser el resultado esperado?

+0

puede usar una sola función con 'yield b': 1.' para f en fib (n): imprimir f' 2. 'result = list (fib (n))' – jfs

Respuesta

9

Esto es el comportamiento esperado. Cuando importa con from X import Y, el módulo todavía se carga y se ejecuta, como se documenta en el Language Reference. De hecho, cuando lo hace

from fibo import fib 
print("foo") 
import fibo 

imprimirá This is a statement, seguido de foo. El segundo import no imprime nada ya que el módulo ya está en la memoria caché.

Su segundo módulo imprimirá This is a statement seguido de fibo. El módulo conoce su propio nombre en el momento de la carga.

+0

La segunda importación se imprimirá solo si el módulo se recarga usando 'reload()' sobre la tercera línea. –

2

Python tiene que cargar todo el módulo para importar algo de él. Python importa todo el módulo en su memoria caché de módulo, pero solo los símbolos que importa son visibles para usted. (Si importa una segunda vez, no se ejecutará, esto se debe a que el módulo se almacena en caché la primera vez que se importa).

Cuestiones relacionadas