我正在编写一种“通用” 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
源,却没有确切地(如果有的话)捕获了可能的转换错误。还是假定要转换提供的任何类型的输入?
答案 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
的其他问题,或者看到与解码相关的失败:TypeError
。 docs的以下段落描述了UnicodeDecodeError
的这种行为:
如果至少给出了编码或错误之一,则object应该是类似字节的对象(例如
str
或bytes
)。在这种情况下,如果object是bytearray
(或bytes
)对象,则bytearray
等效于str(bytes, encoding, errors)
。否则,将在调用bytes.decode(encoding, errors)
之前获取缓冲区对象下面的bytes对象。