这是一个简单的JSON编码器,将浮点数转换为字符串:
现在有两个测试。第一个创建了一个无穷大的浮点数,并使用自定义编码器对其进行编码。测试通过。
第二个测试也是这样做,但是将浮点数放在了字典中:
class NestedEncoder(json.JSONEncoder):
'''
A JSON Encoder that converts floats/decimals to strings and allows nested objects
'''
def default(self, obj):
if isinstance(obj, float) or obj.__class__.__name__ == "float32":
return self.floattostr(obj)
elif obj.__class__.__name__ == "type":
return str(obj)
elif hasattr(obj, 'repr_json'):
return obj.repr_json()
else:
return json.JSONEncoder.default(self, obj)
def floattostr(self,o,_inf=float('Inf'), _neginf=-float('-Inf'),nan_str="None"):
if o != o:
text = nan_str
elif o == _inf:
text = 'Infinity'
elif o == _neginf:
text = '-Infinity'
else:
return o.__repr__()
return text
现在有两个测试。第一个创建了一个无穷大的浮点数,并使用自定义编码器对其进行编码。测试通过。
def test_inf():
inf = float('Inf')
as_json = json.dumps(inf,cls=NestedEncoder)
assert as_json == "Infinity"
第二个测试也是这样做,但是将浮点数放在了字典中:
def test_inf_dic():
inf = float('Inf')
as_json = json.dumps({'key':inf},cls=NestedEncoder)
assert as_json == "{'key':'Infinity'}"
输出:
=================================== FAILURES ===================================
_________________________________ test_inf_dic _________________________________
def test_inf_dic():
inf = float('Inf')
as_json = json.dumps({'key':inf},cls=NestedEncoder)
> assert as_json == "{'key':'Infinity'}"
E assert '{"key": Infinity}' == "{'key':'Infinity'}"
E - {"key": Infinity}
E ? ^ ^ ^
E + {'key':'Infinity'}
E ? ^ ^ ^ +
编辑:
自定义编码器仅在第一个测试中被调用,而不是第二个。
float('Inf').__class__.__name__
,因此不会匹配您的第一个条件语句。您还试图比较测试中的字符串和字典。 - jordanmfloat('Inf').__class__.__name__
问题并不相关,因为它是一个OR条件。 - gidim