Если вам нужно сделать это в python 2.7 без переопределения глобального json.encoder.FLOAT_REPR, вот один из способов.
import json
import math
class MyEncoder(json.JSONEncoder):
"JSON encoder that renders floats to two decimal places"
FLOAT_FRMT = '{0:.2f}'
def floatstr(self, obj):
return self.FLOAT_FRMT.format(obj)
def _iterencode(self, obj, markers=None):
# stl JSON lame override #1
new_obj = obj
if isinstance(obj, float):
if not math.isnan(obj) and not math.isinf(obj):
new_obj = self.floatstr(obj)
return super(MyEncoder, self)._iterencode(new_obj, markers=markers)
def _iterencode_dict(self, dct, markers=None):
# stl JSON lame override #2
new_dct = {}
for key, value in dct.iteritems():
if isinstance(key, float):
if not math.isnan(key) and not math.isinf(key):
key = self.floatstr(key)
new_dct[key] = value
return super(MyEncoder, self)._iterencode_dict(new_dct, markers=markers)
Затем в python 2.7:
>>> from tmp import MyEncoder
>>> enc = MyEncoder()
>>> enc.encode([23.67, 23.98, 23.87])
'[23.67, 23.98, 23.87]'
В python 2.6 он не совсем работает, как указывает Матвей Шинкель:
>>> import MyEncoder
>>> enc = MyEncoder()
>>> enc.encode([23.67, 23.97, 23.87])
'["23.67", "23.97", "23.87"]'
Если Вы пишете новый код Какао и нацелены на Mac OS X 10.5, используйте сборку "мусора" Objective C.
При написании некоторого кода, который, возможно, также должен работать на iPhone, можно записать и протестировать тот код на обе модели очень легко путем хранения того кода в отдельной платформе, записи этого со свойством -retain
и -release
используйте, и устанавливающий и Вашу платформу и Вашу цель модульного теста для нее к поддерживаемому GC, а не только для GC.
XCode выполнит Ваш пакет модульного теста дважды, однажды с GC на и однажды с GC прочь, и Ваша платформа будет применима под обеими моделями выполнения. Затем, если Вы в конечном счете хотите принести тот код образцового уровня к iPhone, можно поместить его в предназначенную iPhone статическую библиотеку или включать его непосредственно в проект iPhone.
Независимо от того, рассматриваете ли Вы выполнение Вашего кода iPhone, тем не менее, необходимо определенно быть нацелены на сборку "мусора", если приложение потребует Leopard. Это упростит разработку, и сборщик "мусора" Objective C работает вполне хорошо.
Если существует возможность портировать Ваше приложение на iPhone, Вы не должны использовать его.
Сборка "мусора" могла бы иметь отрицательный эффект на производительность, если у Вас есть специальные варианты использования. Без GC Вы имеете точный контроль на разрушении объекта, который не имеет место мир GC. В большинстве проектов это стоит того для включения GC, поскольку это менее подвержено ошибкам и легче.
В теории управление памятью без GC может всегда быть быстрее, что с GC, однако, это не имеет место в наиболее практическом применении (так как GC обычно более оптимизируется тот человек).
Я предпочитаю обрабатывать управление памятью сам, просто потому что мне нравится иметь тот уровень управления. Я знаю на основе опыта на других языках (C#), что GC не позволяет Вам полностью игнорировать проблемы памяти, и это - то же в Какао с вещами как использование слабых ссылок и обратных вызовов (пусто *), где объект явно не принадлежит другому объекту. Вы являетесь в основном торговыми один набор проблем (утечки памяти) для другого. Лично я не склонен делать слишком много ошибок управления памятью в эти дни, и те я действительно делаю, довольно легки разыскать.
Существуют некоторые ситуации (такие как реализация методов источника данных для NSOutlineView, где Вы не хотите сохранять объект, предоставляемый представлению схемы), где я думал, что GC был бы действительно полезен, но я еще не сделал никаких реальных тестов с ним.
Apple перечисляет некоторые другие преимущества и недостатки в руководстве по программированию GC.