Jsonpickle в подклассе меняет тип данных - PullRequest
0 голосов
/ 27 апреля 2020

В одном из моих проектов у меня странная проблема с jsonpickle, пока я запускаю его из того же файла, он работает нормально, но если он запускается из другого класса, он меняет целевой объект на dict. Ниже приведена простая проблема реконструкции. Мои оригинальные классы немного сложны, но проблема та же.

PS Проблема "исчезает", когда в gui.py я меняю import data на from data import * (с другим рефакторингом кода), но я не уверен почему ...

Простой пример:

  1. data.py - один работает отлично
import jsonpickle
from dataclasses import dataclass, field
from typing import List

@dataclass
class Car:
    name: str
    model: str

class CarsList(List):
    # some other non important functions

    def length(self):
        return len(self)

class Company:

    def __init__(self):
        self.companyCars = CarsList()
        self.loadData()
        print(self.companyCars.length())

    def loadData(self):
        with open('cars.json', "r") as infile:
            json_str = infile.read()
        self.companyCars = jsonpickle.decode(json_str)

if __name__ == '__main__':
    myCompany = Company()  # works fine
gui .py (не работает)
import data
class Gui:
    def __init__(self):
        self.myCompany = data.Company()

if __name__ == '__main__':
    myGui = Gui()  # Not working !

Второй файл возвращает ошибку:

Traceback (most recent call last):
  File "/home/bart/costam/gui.py", line 15, in <module>
    myGui = Gui()  # Not working !
  File "/home/bart/costam/gui.py", line 11, in __init__
    self.myCompany = data.Company()
  File "/home/bart/costam/data.py", line 40, in __init__
    print(self.companyCars.length())
AttributeError: 'dict' object has no attribute 'length'

1 Ответ

3 голосов
/ 27 апреля 2020

Класс недоступен в глобальном масштабе, поэтому jsonpickle не может его декодировать.

В документах : The object must be accessible globally via a module and must inherit from object (AKA new-style classes).

Вот почему проблема «исчезает», когда вы делаете from data import *.

...