Как я могу выбрать определение класса? - PullRequest
0 голосов
/ 04 марта 2019

У меня проблемы с выбором класса, импортирующего класс из другого модуля.

Представьте, что у меня есть файл classA.py с определением класса A:

class A:
    def execute(self):
        print('Hello from class A!')

Затем яесть другой файл classB.py:

import dill
import classA

class B:
    def __init__(self):
        self.a = classA.A()

    def execute(self):
        self.a.execute()
        print('Hello from class B!')


b = B()

with open('/file/path', 'wb') as f:
    dill.dump(b, f)

Если тогда я попытаюсь открепить созданный файл из другого каталога с помощью:

with open('file/path', 'rb') as f:
    b = dill.load(f)

Я получаю ошибку:

ModuleNotFoundError: No module named 'classB'

Конечно, он работает в той же папке, в которой у меня есть файлы classA.py и classB.py, потому что интерпретатор может найти определение двух классов.

Так что, думаю, мне нужно как-топеренести определение классов в файл pickle.Как я могу это сделать?

Спасибо, Стефано

1 Ответ

0 голосов
/ 04 марта 2019

Конечно, он работает в той же папке, в которой у меня есть файлы classA.py и classB.py, потому что интерпретатор может найти определение двух классов.Так что, я думаю, мне нужно как-то перенести определение классов в файл pickle.Как я могу это сделать?

Это не так, как это работает.Вы не «вносите определение классов в файл pickle» - , что не имело бы смысла , так как только имя, квалифицированное для класса, засолено (квалифицированное имя => packagename.modulename.classname)

Вместо этого вы должны убедиться, что модули, в которых определены классы, импортируются при откреплении - «импортируемые», что означает, что путь к родительской папке пакета или модуля находится в вашем sys.path.Вы можете сделать это несколькими способами (используя переменную окружения PYTHONPATH, возиться с sys.path прямо в вашем коде - что часто является плохой идеей, а иногда и правильным решением), устанавливая ваш модуль в virtualenv и активируя эту virtualenv и т. Д.)

NB. Текущий рабочий каталог всегда находится в вашем sys.path, поэтому «он работает, конечно, в одной папке».

...