Как сериализовать как позиционные, так и непозиционные аргументы Python объектов? - PullRequest
1 голос
/ 28 февраля 2020

Как я могу сериализовать test ниже:

class Foo:
    a = 0
    b = {}

    def __init__(self, a, b=None):
        self.a = a

        if b:
            self.b = b


test = Foo(1)
test.b['c'] = 2

, чтобы получить результат:

{"a": 1, "b": {"c": 2}}

Я пробовал:

print(json.dumps(test, default=lambda x: x.__dict__))

но он возвращает:

{"a": 1}

Я понимаю, что test.b['c'] = 2 не добавляет b или c к Foo.__dict__, поэтому, вероятно, x.__dict__ в лямбда-выражениях не поднимает их , Так ответ один из:

  1. Не назначайте пары ключ-значение произвольным объектам; вместо этого используйте setattr.
  2. Не определяйте произвольные классы, если их набор свойств может развиваться во время выполнения; вместо этого используйте простой dict.

1 Ответ

2 голосов
/ 28 февраля 2020

Проблема в том, что test.b не является переменной экземпляра. Поэтому, когда вы сериализуете объект test, используя json.dumps, он вообще не находит переменную экземпляра b.

Если вы переопределите конструктор, как показано ниже:

class Foo:
    a = 0 #this is not instance variable - this is a class variable
    b = {} #this is not instance variable - this is a class variable

    def __init__(self, a, b=None):
        self.a = a
        self.b = {} #declared the instance variable b also
        if b:
            self.b = b


test = Foo(1)
test.b['c'] = 2

Теперь, если вы запустите, вы получите желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...