Penso che le soluzioni per il manuale assistito di PurityLake e Martijn Pieters siano probabilmente la soluzione migliore. Ma non è impossibile per farlo a livello di programmazione.
Innanzitutto, è necessario ottenere un elenco di tutti i nomi esistenti nel dizionario del modulo che potrebbero essere utilizzati nel codice. Sto assumendo il codice non chiama direttamente eventuali Dunder funzioni, ecc
Quindi, è necessario per scorrere attraverso di loro, utilizzando inspect.getmodule()
per scoprire quale modulo ogni oggetto è stato originariamente definito. E io sono partendo dal presupposto che non stai usando nulla che sia stato doppiamente from foo import *
-ed.Creare un elenco di tutti i nomi definiti nei moduli numpy
e scipy
.
Ora è possibile prendere quell'uscita e sostituire semplicemente ogni foo
con numpy.foo
.
Così, mettendo insieme, qualcosa di simile:
for modname in sys.argv[1:]:
with open(modname + '.py') as srcfile:
src = srcfile.read()
src = src.replace('from numpy import *', 'import numpy')
src = src.replace('from scipy import *', 'import scipy')
mod = __import__(modname)
for name in dir(mod):
original_mod = inspect.getmodule(getattr(mod, name))
if original_mod.__name__ == 'numpy':
src = src.replace(name, 'numpy.'+name)
elif original_mod.__name__ == 'scipy':
src = src.replace(name, 'scipy.'+name)
with open(modname + '.tmp') as dstfile:
dstfile.write(src)
os.rename(modname + '.py', modname + '.bak')
os.rename(modname + '.tmp', modname + '.py')
Se una delle ipotesi è sbagliato, non è difficile modificare il codice. Inoltre, potresti voler utilizzare tempfile.NamedTemporaryFile
e altri miglioramenti per assicurarti di non sovrascrivere accidentalmente cose con file temporanei. (Non volevo affrontare il problema di scrivere qualcosa di multipiattaforma, se non stai lavorando su Windows, è facile.) E aggiungi qualche gestione degli errori, ovviamente, e probabilmente alcuni rapporti.
che provo per te. Spero che tu trovi qualche bell'attrezzo. (+1) – NPE
Ancora meglio, spero che tu scriva un bell'attrezzo (che sia basato sulla mia risposta o meno) e lo pubblichi su PyPI, quindi se mai avrò bisogno di una cosa del genere, non dovrò farlo da solo. :) – abarnert
Vedi anche questa domanda: [Esiste un IDE/utilità per il refactoring di Python * per l'utilizzo della sintassi modulo.member standard?] (Http://stackoverflow.com/questions/12677061/is-there-an-ide- utility-to-refactor-python-imports-to-use-standard-module-memb) –