简体   繁体   中英

Python: create jsonpickle from a class and unpack, Error AttributeError: type object ' ' has no attribute 'decode'

So, I have class that I use in a Flask app. I use this class in multiple pages, which is why I would like to save the creates class object in a pickle, and unpack it when I need it again. It just keeps on giving me errors.. I have a class that looks similar to this:

class files(name):

    def __init__(self, name):
        self.name = name
        self.settings = Settings()
        self.files_directory = self.settings.files_directory
        self.files = self.create_list()

    def store_files_from_folder(self):
        loaded_files = []
        files = list_files()

        for file in files:
            file_path = os.path.join(self.files_directory, file)
            print('Loading file: {}'.format(file))
            loaded_file = function_reads_in_files_from_folder(file_path, self.name)
            loaded_files.append(loaded_file)

        print('Loaded {} files'.format(len(loaded_files)))

and I'm trying to create the jsonpickle like this:

creates_class = files("Mario")
jsonpickle_test = jsonpickle.encode(creates_class, unpicklable=False)
result = jsonpickle.decode(jsonpickle_test, files)

But I get the following error:

Traceback (most recent call last):
  File "C:\Users\lib\site-packages\IPython\core\interactiveshell.py", line 3343, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-8-23e9b5d176ac>", line 1, in <module>
    result = jsonpickle.decode(jsonpickle_test, files)
  File "C:\Users\lib\site-packages\jsonpickle\unpickler.py", line 41, in decode
    data = backend.decode(string)
AttributeError: type object 'files' has no attribute 'decode'

And I can't get to resolve it. Could someone help me?

The problem is in the passed argument unpickable=False

unpicklable – If set to False then the output will not contain the information necessary to turn the JSON data back into Python objects , but a simpler JSON stream is produced.

You can avoid unpickable=False or load the produced data with json.loads to a dict and then use de kwargs arguments for the object creation

creates_class = files("Mario")
jsonpickle_test = jsonpickle.encode(creates_class, unpicklable=False)
result_dict = json.loads(jsonpickle_test)
create_class = files(**result_dict)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM