使用json.dumps()创建int的子类,意外行为

问题描述 投票:0回答:1

我正在尝试创建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__之外,还缺少某种方法来解决此问题吗?

python json
1个回答
0
投票

此示例解决了您的错误,但不能解决您的问题:

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)
print(json.dumps(y))

结果:

'2'
[2]

注意json.dumps()现在如何正确显示您的2。但是它仍然没有像print()那样显示引号。这是因为json识别要求转储的变量的类型,而它只是int

如果需要,您需要说服json实际上只是一个字符串,或者说json将作为字符串添加到转储中的某种类型。但这几乎会破坏您可能想到的其他用途。

我认为真正的问题是XY问题。不用问如何使您的解决方案有效,您也许可以与新类型一起分享要解决的问题?

© www.soinside.com 2019 - 2024. All rights reserved.