Импорт класса из сохраненной ссылки - PullRequest
1 голос
/ 06 октября 2019

Учитывая класс 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}"). Это кажется слишком хакерским и очень небезопасным (хотя меня не волнует безопасность в этом контексте).

Есть ли лучший способ сделать это?

...