Vorrei sapere se è previsto il seguente comportamento o un bug. Sto usando CPython2.7caricamento moduli da imp.load_source con lo stesso nome risultante dalla fusione dei moduli
Creare un file x.py
def funcA():
print "funcA of x.py"
def funcB():
print "funcB of x.py"
Creare un file y.py
def funcB():
print "funcB of y.py"
Creare un file test.py
import sys, imp
# load x.py as fff
m = imp.load_source('fff', 'x.py')
print dir(m)
print sys.modules.get('fff')
# load y.py as fff
m = imp.load_source('fff', 'y.py')
print dir(m)
print sys.modules.get('fff')
# import and exec func
import fff
fff.funcA()
fff.funcB()
print dir(fff)
Il risultato
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'funcA', 'funcB']
<module 'fff' from 'x.py'>
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'funcA', 'funcB']
<module 'fff' from 'y.py'>
funcA of x.py
funcB of y.py
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'funcA', 'funcB']
La mia aspettativa era che il secondo imp.load_source
sostituisse completamente il modulo x.py con y.py. Infatti, sys.modules.get('fff')
mostra <module 'fff' from 'y.py'>
ma il modulo risultante era come un mix di x.py e y.py e quest'ultimo ha la precedenza.
È previsto o un errore?
EDIT: il mio codice di prova ha avuto un refuso. aggiornato il risultato.
Grazie mille per aver guardato fino in import.c. Mi chiedo qual è il caso di utilizzo corretto di questo.Il documento potrebbe essere più esplicito sulla fusione. Altre funzioni nello stesso modulo come 'load_module' e' reload' hanno una documentazione molto migliore. –
Esiste un modo in cui i moduli non vengono uniti ma sostituiti? – foobar
sì, sempre 'del sys.modules ['nome del modulo']' prima di imp.load_source. –