Лично, я только использую тернарный оператор, если он соответствует на одной строке. Если это должно охватить, то время для старого доброго
if else if else
К сожалению, я считаю, что вы должны делать это с помощью обезьяньего исправления (что, на мой взгляд, , указывает на дефект в конструкции стандартной библиотеки 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
был разработан не так: - (.
Вы можете делать то, что вам нужно, но это не задокументировано:
>>> import json
>>> json.encoder.FLOAT_REPR = lambda f: ("%.2f" % f)
>>> json.dumps([23.67, 23.97, 23.87])
'[23.67, 23.97, 23.87]'
Если вы застряли на 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]'
>>>
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.