str无法处理转换时会带来什么样的错误?

时间:2018-09-17 11:40:05

标签: python json jsonconvert

我正在编写一种“通用” json解码器,它将使用默认的json编码器加集来转换它可以转换的所有内容,以及它将使用str()转换的所有其他内容-有点愚蠢,但是它将允许仅静默地工作,并让用户知道最初存在什么样的数据。

因此,通过小的修改,以下代码摘自here

import json
class SetEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, set):
            return list(obj)
        try:
            return json.JSONEncoder.default(self, obj)
        except TypeError:
            return str(obj)

然后,如果我尝试使用此编码器转换函数,它将返回类似以下内容的内容:

'<function a at 0x10ddd8f28>'

这还是有点愚蠢,但对我来说完全可以。

问题是:如果str()无法转换作为输入参数提供的内容怎么办?会触发哪种错误?我查看了str源,却没有确切地(如果有的话)捕获了可能的转换错误。还是假定要转换提供的任何类型的输入?

1 个答案:

答案 0 :(得分:1)

您可以查看str的文档:

  

如果既未给出编码也未给出错误,则str(object)返回object.__str__(),这是对象的“非正式”或可很好打印的字符串表示形式。对于字符串对象,这是字符串本身。如果对象没有__str__()方法,那么str()会退回到返回的repr(object)

说。除了无法分配更多特定于MemoryError转换的内存(str)之类的情况之外,我看到失败的唯一方法是有人__str__(或{{ 1}}(如果没有__repr__)并将其设为例如

__str__

这将导致:

class C:
    def __str__(self):
        msg = "'{}' instance is not meant to be represented as str."
        raise ValueError(msg.format(self.__class__))

尽管如此:您的问题实际上并没有一个通用的答案,因为它可能引起任何人对其编程的兴趣。

编辑:以上所有内容都与简单的>>> c = C() >>> str(c) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in __str__ ValueError: '<class '__main__.C'>' instance is not meant to be represented as str. 调用有关,只是传递了一个对象,如您的示例所示。如果尝试通过指定str和/或encoding解码传入的对象。除了bytes-like输入外,您可能会遇到errors的其他问题,或者看到与解码相关的失败:TypeErrordocs的以下段落描述了UnicodeDecodeError的这种行为:

  

如果至少给出了编码或错误之一,则object应该是类似字节的对象(例如strbytes)。在这种情况下,如果object是bytearray(或bytes)对象,则bytearray等效于str(bytes, encoding, errors)。否则,将在调用bytes.decode(encoding, errors)之前获取缓冲区对象下面的bytes对象。