我如何腌制一个班级定义?

时间:2019-03-04 09:53:35

标签: python class pickle definition

我很难选择从另一个模块中导入类的类。

想象一下,我有一个定义了A类的文件classA.py:

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 :(得分:1)

  

它当然可以在我有文件classA.py和classB.py的文件夹中工作,因为解释器可以找到两个类的定义。   所以我想我必须以某种方式将类的定义引入pickle文件中。我该怎么办?

这不是它的工作方式。您不会“将类的定义带入pickle文件中”-which would make no sense,因为仅对类限定名进行了酸洗(限定名=> packagename.modulename.classname)

相反,您必须确保解开时定义了类的模块可导入-“ importable”表示程序包或模块的父文件夹路径在您的sys.path中。您可以通过几种方式来做到这一点(使用PYTHONPATH环境变量,直接在代码中弄乱sys.path-这通常是一个坏主意,有时甚至是正确的解决方案-在virtualenv中安装模块并激活此virtualenv等) )

注意:当前的工作目录始终位于您的sys.path中的第一位,这就是为什么“它当然可以在同一文件夹中工作”的原因。