Я думаю, что решения PurityLake и Martijn Pieters с вспомогательным ручным управлением, вероятно, являются лучшим способом. Но невозможно сделать это программно.
Во-первых, вам нужно получить список всех имен, существующих в словаре модуля, которые могут использоваться в коде. Я предполагаю, что ваш код напрямую не вызывает какие-либо функции dunder и т. д.
Затем вам нужно перебрать их, используя inspect.getmodule()
, чтобы узнать, в каком модуле был изначально определен каждый объект. И я предполагаю, что вы не используете ничего, что было дважды from foo import *
-ed. Составьте список всех имен, которые были определены в модулях numpy
и scipy
.
Теперь вы можете взять этот вывод и просто заменить каждый foo
на numpy.foo
.
Итак, собирая это, что-то вроде этого:
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')
Если одно из предположений неверно, изменить код несложно. Кроме того, вы можете использовать tempfile.NamedTemporaryFile
и другие улучшения, чтобы случайно не перезаписать временные файлы. (Я просто не хотел иметь дело с головной болью написания чего-то кросс-платформенного; если вы не работаете в Windows, это легко.) И, очевидно, добавить некоторую обработку ошибок и, возможно, некоторые отчеты.
person
abarnert
schedule
07.03.2013