重写使用gen的JSONEncoder上的\u iterencode方法的问题

2024-09-28 22:36:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建我自己的自定义编码器,主要重用JSONEncoder行为:

BinaryJSONEncoder(JSONEncoder):
    def _iterencode(self, o, markers):
        sys.stderr.write("Calling custom _iterencode\n")
        try:
             return JSONEncoder._iterencode(self, o, markers)
        except UnicodeDecodeError:
             sys.stderr.write("Got exception\n")
             return ""

但是,我仍然得到一个未处理的unicodedecoderror,因为一旦调用了_iterencode方法,它会在返回之前循环使用它的生成器。奇怪的是,异常源于\u iterencode方法,但我的方法不在返回堆栈中!但是我的函数被调用了,因为Apache错误日志中会出现“调用自定义的iterencode”消息。在不从头开始实现整个方法的情况下,如何解决这个问题?在

这是堆栈:

^{pr2}$

Tags: 方法selfreturn堆栈defcustomstderrsys
1条回答
网友
1楼 · 发布于 2024-09-28 22:36:20

解决此问题的唯一可行方法似乎是再次使用二进制数据的处理程序来实现整个函数:

从json编码器导入encode_basestring_ascii,encode_basestring

class BinaryJSONEncoder(JSONEncoder):
    def _iterencode(self, o, markers=None):
        if isinstance(o, str):
            try:
                o = unicode(o, "utf8")
            except UnicodeDecodeError:
                o = base64.b64encode(o)

        if isinstance(o, basestring):
            if self.ensure_ascii:
                encoder = encode_basestring_ascii
            else:
                encoder = encode_basestring
            _encoding = self.encoding
            if (_encoding is not None and isinstance(o, str)
                    and not (_encoding == 'utf-8')):
                o = o.decode(_encoding)
            yield encoder(o)
        elif o is None:
            yield 'null'
        elif o is True:
            yield 'true'
        elif o is False:
            yield 'false'
        elif isinstance(o, (int, long)):
            yield str(o)
        elif isinstance(o, float):
            yield floatstr(o, self.allow_nan)
        elif isinstance(o, (list, tuple)):
            for chunk in self._iterencode_list(o, markers):
                yield chunk
        elif isinstance(o, dict):
            for chunk in self._iterencode_dict(o, markers):
                yield chunk
        else:
            if markers is not None:
                markerid = id(o)
                if markerid in markers:
                    raise ValueError("Circular reference detected")
                markers[markerid] = o
            for chunk in self._iterencode_default(o, markers):
                yield chunk
            if markers is not None:
                del markers[markerid]

我理解抛出异常时收益率退出的问题,但为什么不能在没有异常的情况下调用超类方法,然后只调用超类方法?在

相关问题 更多 >