Учитывая класс Python, импортированный в текущем контексте, есть ли способ сохранить сериализуемую (выбираемую) ссылку на этот класс, которую можно будет импортировать позже в другом контексте Python?
Например,
Сначала сохраните ссылку. В этом примере get_reference
и import_reference
- это функция, которую я хочу реализовать.
import pickle
from torch.optim import SGD
sgd = SGD()
# ... do work ...
opt_reference = get_reference(sgd.__class__)
with open('SGD_ref.pkl', 'wb') as fp:
pickle.dump(opt_reference, fp)
Затем для импорта ссылки
import pickle
with open('SGD.pkl', 'rb') as fp:
opt_reference = pickle.load(fp)
SGD = import_reference(opt_reference)
sgd = SGD()
Я не хочу сохранять код или реализацию самой функции SGD, поскольку она также импортирует несколько вещей самостоятельно. Я предполагаю, что модуль, для которого я хочу сохранить ссылку, аналогичным образом устанавливается и импортируется в каждую среду Python, в которой он будет использоваться.
Один простой подход, который я нашел, заключается в использовании функции из thisотправьте , чтобы получить путь для функции get_reference
, а затем для import reference
do eval(f"import {opt_reference}")
. Это кажется слишком хакерским и очень небезопасным (хотя меня не волнует безопасность в этом контексте).
Есть ли лучший способ сделать это?