Формат пускает в ход со стандартом json модуль

Лично, я только использую тернарный оператор, если он соответствует на одной строке. Если это должно охватить, то время для старого доброго

if else if else
89
задан mskfisher 9 May 2012 в 16:31
поделиться

4 ответа

К сожалению, я считаю, что вы должны делать это с помощью обезьяньего исправления (что, на мой взгляд, , указывает на дефект в конструкции стандартной библиотеки json пакета). Например, этот код:

import json
from json import encoder
encoder.FLOAT_REPR = lambda o: format(o, '.2f')

print json.dumps(23.67)
print json.dumps([23.67, 23.97, 23.87])

излучает:

23.67
[23.67, 23.97, 23.87]

по вашему желанию. Очевидно, должен быть продуманный способ переопределения FLOAT_REPR , чтобы КАЖДОЕ представление поплавка находилось под вашим контролем, если вы хотите; но, к сожалению, пакет json был разработан не так: - (.

75
ответ дан 24 November 2019 в 07:15
поделиться

Вы можете делать то, что вам нужно, но это не задокументировано:

>>> import json
>>> json.encoder.FLOAT_REPR = lambda f: ("%.2f" % f)
>>> json.dumps([23.67, 23.97, 23.87])
'[23.67, 23.97, 23.87]'
7
ответ дан 24 November 2019 в 07:15
поделиться

Если вы застряли на Python 2.5 или более ранней версии версии: похоже, трюк с обезьяной-патчем не работает с исходным модулем simplejson, если установлены ускорения C:

$ python
Python 2.5.4 (r254:67916, Jan 20 2009, 11:06:13) 
[GCC 4.2.1 (SUSE Linux)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import simplejson
>>> simplejson.__version__
'2.0.9'
>>> simplejson._speedups
<module 'simplejson._speedups' from '/home/carlos/.python-eggs/simplejson-2.0.9-py2.5-linux-i686.egg-tmp/simplejson/_speedups.so'>
>>> simplejson.encoder.FLOAT_REPR = lambda f: ("%.2f" % f)
>>> simplejson.dumps([23.67, 23.97, 23.87])
'[23.670000000000002, 23.969999999999999, 23.870000000000001]'
>>> simplejson.encoder.c_make_encoder = None
>>> simplejson.dumps([23.67, 23.97, 23.87])
'[23.67, 23.97, 23.87]'
>>> 
9
ответ дан 24 November 2019 в 07:15
поделиться
import simplejson

class PrettyFloat(float):
    def __repr__(self):
        return '%.15g' % self

def pretty_floats(obj):
    if isinstance(obj, float):
        return PrettyFloat(obj)
    elif isinstance(obj, dict):
        return dict((k, pretty_floats(v)) for k, v in obj.items())
    elif isinstance(obj, (list, tuple)):
        return map(pretty_floats, obj)  # in Python3 do: list(map(pretty_floats, obj))
    return obj

print simplejson.dumps(pretty_floats([23.67, 23.97, 23.87]))

emits

[23.67, 23.97, 23.87]

No monkeypatching necessary.

58
ответ дан 24 November 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: