Создание подкласса int, неожиданное поведение с json .dumps () - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь создать подкласс int, который печатается как строка, но может использоваться как математическая переменная.

Это то, что у меня есть:

class xint(int):

    def __new__(self, value):
        self.value = value
        return super(xint, self).__new__(self)

    def __str__(self):
        return f"'{self.value}'"
    __repr__ = __str__

    def __eq__(self, other):
        return self.value == other

Используя это, я могу:

x = xint(2)
x = [x]
print(x)
>> ['2']

И это именно то поведение, которое я хочу. Но у меня проблема в том, что если я попытаюсь преобразовать этот список в строку JSON, то вместо ['2'] я получу [0].

import json

x = xint(2)
x = [x]
x = json.dumps(x)
print(x)
>> [0]

Есть ли какой-то метод, в котором мне не хватает чтобы исправить это в дополнение к __repr__ и __str__?

1 Ответ

1 голос
/ 18 июня 2020

Этот пример исправляет ваши ошибки, но не решает вашу проблему:

import json


class Xint(int):
    def __str__(self):
        return f"'{int(self)}'"

    # I'm leaving this in, but I think it's wrong
    # a representation like f'Xint({int(self)})' would be better
    __repr__ = __str__


x = Xint(2)
y = [x]
print(x, y)
print(json.dumps(y))

Результат:

'2' ['2']
[2]

Обратите внимание, как json.dumps() теперь правильно отображает 2. Но он по-прежнему не показывает кавычки, как print(). Это связано с тем, что json распознает тип переменной, которую требуется сбросить, и это просто int.

Если вам это нужно, вам нужно убедить json, что это действительно просто строка , или какой-то тип, который json добавит в дамп в виде строки. Но это сломает практически любое другое использование, которое вы можете придумать для своего типа.

Я думаю, что настоящая проблема здесь - проблема XY. Вместо того, чтобы спрашивать, как заставить ваше решение работать, возможно, вы расскажете, какую проблему вы пытались решить с помощью нового типа для начала?

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