0

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

因此,通过小修改,以下代码取自此处

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源代码,并没有得到准确的时间(如果有的话?)它捕获了可能的转换错误。或者假设转换提供的任何类型的输入?

4

1 回答 1

1

您可以查看以下文档str

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

那说。除了无法分配更多内存 ( MemoryError) 这不是str特定于转换的情况之外,我可以看到此失败的唯一方法是如果有人重载__str__(或者__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和/或来解码传入对象errors。您可能会遇到除字节类TypeError输入之外的任何其他内容,或查看与解码相关的失败:. 这种行为在其文档的以下段落中进行了描述:UnicodeDecodeErrorstr

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

于 2018-09-17T16:50:57.213 回答