Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用json.dumps()创建int的子类,异常行为_Python_Json - Fatal编程技术网

Python 使用json.dumps()创建int的子类,异常行为

Python 使用json.dumps()创建int的子类,异常行为,python,json,Python,Json,我试图创建一个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_

我试图创建一个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字符串,则会得到[0],而不是['2']


除了_repr_uuu和_str_uuu外,我还缺少一些方法来修复此问题。

此示例修复了您的错误,但无法解决您的问题:

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。但它仍然不像印刷品那样显示引号。这是因为json识别要求它转储的变量的类型,它只是一个int

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


我认为真正的问题是XY问题。与其问如何使您的解决方案工作,也许您可以分享您试图用新类型解决的问题?

使用这样的单引号将是无效的JSON,因此JSON模块永远不会生成它。您需要将原始值保存在int对象中。您不需要使用uuu new uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。为什么需要将值保存在self.value而不是int internal中?首先,这没有意义。其次,json.dumps永远不会使用您的。它生成JSON,如果允许您在其输出中放入任意可能非JSON的文本,则会破坏这一点。@VisioN感谢您的评论。你能发布一个答案来说明你的意思吗?我不确定如何使用int内部结构。json不使用字符串表示的原因是,它没有向对象请求表示或可打印字符串,而是读取其类型和值,推断它是整数,并创建当前整数表示。它显示为0而不是2的原因是因为你用一个有缺陷的_new _有没有办法不调用intself来实现这一点?它从中继承的int类是否有类似于self.value的内部变量?如果有,您希望它有什么类型?您希望该类型也有一个.value内部变量吗?我不是在开玩笑——int是一种简单的内置类型,从某种意义上说,这就是最终的结果。在这里使用intself的原因是因为它在一个需要字符串值的位置被使用-您希望调用ints str,否则您将进入一个无限循环。我想我明白您现在所说的了。我只是试图避免调用int并为新的_str______函数创建新对象,这肯定比访问必须存储在某处的现有对象的值需要更多的处理器能力。但无论如何,我已经解决了这个问题,现在我调用了继承的_uint_uu函数,而不需要设置self.value。
'2' ['2']
[2]