2012-06-12 18 views
6

Diciamo che ho un modello di pitone fibo.py definito come di seguito:Python: Importazione Modulo

#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 

Nella mia sessione interprete, faccio la seguente:

>> 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' 
>>> 

Fin qui tutto bene. .restart the interpreter:

>>> 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 
>>> 

Mi aspettavo l'errore poiché ho importato solo fib e fib2. Ma non capisco perché l'affermazione è stata stampata quando ho importato solo fib e fib2.

In secondo luogo se cambio il modulo come:

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

quello che dovrebbe essere il risultato atteso?

+0

è possibile utilizzare una singola funzione con 'yield b': 1.' for f in fib (n): print f' 2. 'result = list (fib (n))' – jfs

risposta

9

Questo comportamento è previsto. Quando si importa con from X import Y, il modulo viene ancora caricato ed eseguito, come documentato nello Language Reference. Infatti, quando si fa

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

stamperà This is a statement, seguito da foo. Il secondo import non stampa nulla poiché il modulo è già in cache.

Il secondo modulo stampa This is a statement seguito da fibo. Il modulo conosce il proprio nome al momento del caricamento.

+0

La seconda importazione verrà stampata solo se il modulo viene ricaricato usando 'reload()' sopra la terza linea. –

2

Python deve caricare l'intero modulo per importare qualsiasi cosa da esso. Python importa l'intero modulo nella sua cache dei moduli, ma solo i simboli che si importano sono visibili all'utente. (Se si importa una seconda volta, non verrà eseguito, poiché il modulo viene memorizzato nella cache la prima volta che viene importato.)

Problemi correlati